ende 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c15447034d52dc8068994d183579def24eb1bf8c
4
- data.tar.gz: cd61b314b42387239996caa53425988ca0319781
3
+ metadata.gz: 77326bb1ae8e8f462c74148ac7dee0d927123810
4
+ data.tar.gz: e95a8ebc3fb093e12fdc7d6dffe2e913fc951ece
5
5
  SHA512:
6
- metadata.gz: 3917492bbffd9e1501097cd1a7034d8f519192e2fa7a7452fd727a0634da8ae658be8eb2da9388607b401575cce8984e9a6049e0e524ec7ea50dfcc82e1df2d3
7
- data.tar.gz: e18c60a2973c4c58c7ac97d1f4f8bd25f320a00189dc2f07c9bba3300a26f5897ceb0393eb0dc3671b7256653377d951b6f3a3760bc42f2506c609260f41fd5a
6
+ metadata.gz: 01c9fa286f8adcd1ea0d85bd03b870e074a1d5b10fdd5b4b8da296b51de84c1aaa23fcdcb917bb0ab213ee7dc22132aff2a669bd5b86dbd92f7aa5f9c6958f52
7
+ data.tar.gz: b5961bc6db5a99e2d5289b14de0ab8f52bcb79268f5ea4aa461fa676d42dd213e39c1f779f2d75d6b2227e6105d34420ddca94b3aa971d53c40b65522d0c1451
data/component.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ened",
3
3
  "repo": "indefinido/ened",
4
4
  "description": "Core web application functionacility",
5
- "version": "0.1.0",
5
+ "version": "0.1.1",
6
6
  "keywords": [],
7
7
  "dependencies": {
8
8
  "mikeric/rivets": "v0.5.12",
@@ -37,4 +37,4 @@
37
37
  "vendor/assets/javascripts"
38
38
  ],
39
39
  "license": "MIT"
40
- }
40
+ }
@@ -116,6 +116,7 @@ define 'config/load_components', ['application_components'], ->
116
116
 
117
117
  catch e
118
118
  console.warn 'Failed to load \'', params[0], "' with #{using}: Error: '", e.message, '\'. Trying with requirejs.'
119
+ console.error params[0]
119
120
  loader.activate 'requirejs'
120
121
  module = loader.loaders.discovered.apply @, params unless module
121
122
 
@@ -1,5 +1,6 @@
1
1
  # TODO think if require jquery and jquery inview in this place is actualy a good idead
2
2
 
3
+
3
4
  # TODO use requirejs alias / packing modules definition for this
4
5
  define 'ende', ['config/load_components', 'config/initializers', 'jquery.ujs'], ->
5
6
 
@@ -13,7 +14,7 @@ define 'ende', ['config/load_components', 'config/initializers', 'jquery.ujs'],
13
14
  require.register('advisable' , (r, e, module) -> module.exports = require("indefinido-advisable").mixin )
14
15
 
15
16
  # TODO rename ened to ende, move shims to an extension
16
- define 'es5-shim' , [], -> require "ened/vendor/assets/javascripts/polyfills/es5-shim.js"
17
- define 'es6-map-shim' , [], -> require "ened/vendor/assets/javascripts/polyfills/es6-map-shim.js"
18
- define 'es6-shim' , [], -> require "paulmillr-es6-shim"
17
+ define 'es5-shim' , ['observable'], -> require "ened/vendor/assets/javascripts/polyfills/es5-shim.js"
18
+ define 'es6-map-shim' , ['es5-shim'] , -> require "ened/vendor/assets/javascripts/polyfills/es6-map-shim.js"
19
+ define 'es6-shim' , ['es5-shim'] , -> require "paulmillr-es6-shim"
19
20
 
data/lib/ende/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ende
2
- VERSION = "0.4.4"
2
+ VERSION = "0.4.5"
3
3
  end
@@ -26,14 +26,10 @@ function require(path, parent, orig) {
26
26
  // perform real require()
27
27
  // by invoking the module's
28
28
  // registered function
29
- if (!module._resolving && !module.exports) {
30
- var mod = {};
31
- mod.exports = {};
32
- mod.client = mod.component = true;
33
- module._resolving = true;
34
- module.call(this, mod.exports, require.relative(resolved), mod);
35
- delete module._resolving;
36
- module.exports = mod.exports;
29
+ if (!module.exports) {
30
+ module.exports = {};
31
+ module.client = module.component = true;
32
+ module.call(this, module.exports, require.relative(resolved), module);
37
33
  }
38
34
 
39
35
  return module.exports;
@@ -20246,218 +20242,230 @@ module.exports = composed;
20246
20242
 
20247
20243
  });
20248
20244
  require.register("indefinido-indemma/lib/record/validatable.js", function(exports, require, module){
20249
- (function() {
20250
- var errorsable, extensions, initializers, manager, messages, observable, root, stampit, type;
20245
+ var errorsable, extensions, initializers, manager, messages, observable, root, stampit, type;
20251
20246
 
20252
- require('./translationable');
20247
+ require('./translationable');
20253
20248
 
20254
- root = typeof exports !== "undefined" && exports !== null ? exports : this;
20249
+ root = typeof exports !== "undefined" && exports !== null ? exports : this;
20255
20250
 
20256
- stampit = require('../../vendor/stampit');
20251
+ stampit = require('../../vendor/stampit');
20257
20252
 
20258
- observable = require('observable').mixin;
20253
+ observable = require('observable').mixin;
20259
20254
 
20260
- type = require('type');
20255
+ type = require('type');
20261
20256
 
20262
- messages = {
20263
- blank: function(attribute_name) {
20264
- attribute_name = this.human_attribute_name(attribute_name);
20265
- return "O campo " + attribute_name + " não pode ficar em branco.";
20266
- },
20267
- cpf: function(attribute_name) {
20268
- attribute_name = this.human_attribute_name(attribute_name);
20269
- return "O campo " + attribute_name + " não está válido.";
20270
- },
20271
- confirmation: function(attribute_name) {
20272
- var confirmation_attribute_name;
20273
- confirmation_attribute_name = this.human_attribute_name(attribute_name);
20274
- attribute_name = this.human_attribute_name(attribute_name.replace('_confirmation', ''));
20275
- return "O campo " + attribute_name + " não está de acordo com o campo " + confirmation_attribute_name + ".";
20276
- },
20277
- associated: function(attribute_name) {
20278
- attribute_name = this.human_attribute_name(attribute_name);
20279
- return "O registro associado " + attribute_name + " não é válido.";
20280
- },
20281
- server: function(attribute_name, options) {
20282
- if (attribute_name === 'base') {
20283
- return options.server_message;
20284
- } else {
20285
- attribute_name = this.human_attribute_name(attribute_name);
20286
- return "" + attribute_name + " " + options.server_message + ".";
20287
- }
20288
- },
20289
- type: function(attribute_name, options) {
20257
+ messages = {
20258
+ blank: function(attribute_name) {
20259
+ attribute_name = this.human_attribute_name(attribute_name);
20260
+ return "O campo " + attribute_name + " não pode ficar em branco.";
20261
+ },
20262
+ cpf: function(attribute_name) {
20263
+ attribute_name = this.human_attribute_name(attribute_name);
20264
+ return "O campo " + attribute_name + " não está válido.";
20265
+ },
20266
+ confirmation: function(attribute_name) {
20267
+ var confirmation_attribute_name;
20268
+
20269
+ confirmation_attribute_name = this.human_attribute_name(attribute_name);
20270
+ attribute_name = this.human_attribute_name(attribute_name.replace('_confirmation', ''));
20271
+ return "O campo " + attribute_name + " não está de acordo com o campo " + confirmation_attribute_name + ".";
20272
+ },
20273
+ associated: function(attribute_name) {
20274
+ attribute_name = this.human_attribute_name(attribute_name);
20275
+ return "O registro associado " + attribute_name + " não é válido.";
20276
+ },
20277
+ server: function(attribute_name, options) {
20278
+ if (attribute_name === 'base') {
20279
+ return options.server_message;
20280
+ } else {
20290
20281
  attribute_name = this.human_attribute_name(attribute_name);
20291
- return "O campo " + attribute_name + " não está válido.";
20282
+ return "" + attribute_name + " " + options.server_message + ".";
20292
20283
  }
20293
- };
20284
+ },
20285
+ type: function(attribute_name, options) {
20286
+ attribute_name = this.human_attribute_name(attribute_name);
20287
+ return "O campo " + attribute_name + " não está válido.";
20288
+ }
20289
+ };
20294
20290
 
20295
- errorsable = stampit({
20296
- add: function(attribute_name, message_key, options) {
20297
- var translator;
20298
- this.push([attribute_name, message_key, options]);
20299
- this.messages[attribute_name] = '';
20300
- translator = messages[message_key];
20301
- if (translator != null) {
20302
- return this.messages[attribute_name] += translator.call(this.model, attribute_name, options);
20303
- } else {
20304
- return this.messages[attribute_name] += message_key;
20305
- }
20306
- },
20307
- clear: function() {
20308
- var attribute_name, _results;
20309
- if (this.length) {
20310
- this.length = 0;
20311
- _results = [];
20312
- for (attribute_name in this.messages) {
20313
- _results.push(this.messages[attribute_name] = null);
20314
- }
20315
- return _results;
20316
- }
20317
- },
20318
- push: Array.prototype.push,
20319
- splice: Array.prototype.splice,
20320
- indexOf: Array.prototype.indexOf
20321
- }, {
20322
- model: null,
20323
- messages: null,
20324
- length: 0
20325
- }, function() {
20326
- this.messages = {};
20327
- return this;
20328
- });
20291
+ errorsable = stampit({
20292
+ add: function(attribute_name, message_key, options) {
20293
+ var translator;
20329
20294
 
20330
- initializers = {
20331
- define_triggers: function() {
20332
- this.errors = errorsable({
20333
- model: model[this.resource]
20334
- });
20335
- this.before('save', function() {
20336
- if (this.save) return this.validate();
20337
- });
20338
- this.validated = false;
20339
- this.subscribe('dirty', function(value) {
20340
- return value && (this.validated = false);
20341
- });
20342
- return Object.defineProperty(this, 'valid', {
20343
- get: function() {
20344
- this.validate();
20345
- if (this.validation.state() === 'resolved') {
20346
- return !this.errors.length;
20347
- } else {
20348
- return null;
20349
- }
20350
- },
20351
- set: function() {
20352
- throw new TypeError("You can't set the value for the valid property.");
20353
- },
20354
- enumerable: false
20355
- });
20356
- },
20357
- create_validators: function(definitions) {
20358
- var definition, name, validator, validator_options, _ref, _results;
20359
- this.validators = [];
20360
- _ref = manager.validators;
20295
+ this.push([attribute_name, message_key, options]);
20296
+ this.messages[attribute_name] = '';
20297
+ translator = messages[message_key];
20298
+ if (translator != null) {
20299
+ return this.messages[attribute_name] += translator.call(this.model, attribute_name, options);
20300
+ } else {
20301
+ return this.messages[attribute_name] += message_key;
20302
+ }
20303
+ },
20304
+ clear: function() {
20305
+ var attribute_name, _results;
20306
+
20307
+ if (this.length) {
20308
+ this.length = 0;
20361
20309
  _results = [];
20362
- for (name in _ref) {
20363
- validator = _ref[name];
20364
- definition = definitions[validator.definition_key];
20365
- if (definition) {
20366
- if (type(definition) !== 'array') definition = [definition];
20367
- _results.push((function() {
20368
- var _i, _len, _results2;
20369
- _results2 = [];
20370
- for (_i = 0, _len = definition.length; _i < _len; _i++) {
20371
- validator_options = definition[_i];
20372
- if (type(validator_options) !== 'object') {
20373
- validator_options = {
20374
- attribute_name: validator_options
20375
- };
20376
- }
20377
- validator_options.model = this;
20378
- this.validators.push(validator(validator_options));
20379
- _results2.push(delete definitions[validator.definition_key]);
20380
- }
20381
- return _results2;
20382
- }).call(this));
20383
- } else {
20384
- _results.push(void 0);
20385
- }
20310
+ for (attribute_name in this.messages) {
20311
+ _results.push(this.messages[attribute_name] = null);
20386
20312
  }
20387
20313
  return _results;
20388
20314
  }
20389
- };
20315
+ },
20316
+ push: Array.prototype.push,
20317
+ splice: Array.prototype.splice,
20318
+ indexOf: Array.prototype.indexOf
20319
+ }, {
20320
+ model: null,
20321
+ messages: null,
20322
+ length: 0
20323
+ }, function() {
20324
+ this.messages = {};
20325
+ return this;
20326
+ });
20390
20327
 
20391
- extensions = {
20392
- model: {
20393
- validators: null
20394
- },
20395
- record: {
20396
- validate_attribute: function(attribute, doned, failed) {
20397
- var results, validation, validator, _i, _len, _ref;
20398
- this.errors.messages[attribute] = null;
20399
- results = [this, attribute];
20400
- _ref = model[this.resource.toString()].validators;
20401
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
20402
- validator = _ref[_i];
20403
- if (validator.attribute_name === attribute) {
20404
- results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));
20405
- }
20328
+ initializers = {
20329
+ define_triggers: function() {
20330
+ this.errors = errorsable({
20331
+ model: model[this.resource]
20332
+ });
20333
+ this.before('save', function() {
20334
+ if (this.save) {
20335
+ return this.validate();
20336
+ }
20337
+ });
20338
+ this.validated = false;
20339
+ this.subscribe('dirty', function(value) {
20340
+ return value && (this.validated = false);
20341
+ });
20342
+ return Object.defineProperty(this, 'valid', {
20343
+ get: function() {
20344
+ this.validate();
20345
+ if (this.validation.state() === 'resolved') {
20346
+ return !this.errors.length;
20347
+ } else {
20348
+ return null;
20406
20349
  }
20407
- validation = jQuery.when.apply(jQuery, results);
20408
- validation.done(doned);
20409
- validation.fail(failed);
20410
- return validation;
20411
20350
  },
20412
- validate: function(doned, failed) {
20413
- var results, validator, _i, _len, _ref;
20414
- if (this.validated && !this.dirty) return this.validation;
20415
- this.errors.clear();
20416
- results = [this];
20417
- _ref = model[this.resource.toString()].validators;
20418
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
20419
- validator = _ref[_i];
20351
+ set: function() {
20352
+ throw new TypeError("You can't set the value for the valid property.");
20353
+ },
20354
+ enumerable: false
20355
+ });
20356
+ },
20357
+ create_validators: function(definitions) {
20358
+ var definition, name, validator, validator_options, _ref, _results;
20359
+
20360
+ this.validators = [];
20361
+ _ref = manager.validators;
20362
+ _results = [];
20363
+ for (name in _ref) {
20364
+ validator = _ref[name];
20365
+ definition = definitions[validator.definition_key];
20366
+ if (definition) {
20367
+ if (type(definition) !== 'array') {
20368
+ definition = [definition];
20369
+ }
20370
+ _results.push((function() {
20371
+ var _i, _len, _results1;
20372
+
20373
+ _results1 = [];
20374
+ for (_i = 0, _len = definition.length; _i < _len; _i++) {
20375
+ validator_options = definition[_i];
20376
+ if (type(validator_options) !== 'object') {
20377
+ validator_options = {
20378
+ attribute_name: validator_options
20379
+ };
20380
+ }
20381
+ validator_options.model = this;
20382
+ this.validators.push(validator(validator_options));
20383
+ _results1.push(delete definitions[validator.definition_key]);
20384
+ }
20385
+ return _results1;
20386
+ }).call(this));
20387
+ } else {
20388
+ _results.push(void 0);
20389
+ }
20390
+ }
20391
+ return _results;
20392
+ }
20393
+ };
20394
+
20395
+ extensions = {
20396
+ model: {
20397
+ validators: null
20398
+ },
20399
+ record: {
20400
+ validate_attribute: function(attribute, doned, failed) {
20401
+ var results, validation, validator, _i, _len, _ref;
20402
+
20403
+ this.errors.messages[attribute] = null;
20404
+ results = [this, attribute];
20405
+ _ref = model[this.resource.toString()].validators;
20406
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
20407
+ validator = _ref[_i];
20408
+ if (validator.attribute_name === attribute) {
20420
20409
  results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));
20421
20410
  }
20422
- this.validation = jQuery.when.apply(jQuery, results);
20423
- this.validation.done(doned);
20424
- this.validation.fail(failed);
20425
- return this.validation.then(function(record) {
20426
- var old_dirty;
20427
- old_dirty = record.dirty;
20428
- record.dirty = null;
20429
- record.validated || (record.validated = true);
20430
- return record.dirty = old_dirty;
20431
- });
20432
20411
  }
20433
- }
20434
- };
20412
+ validation = jQuery.when.apply(jQuery, results);
20413
+ validation.done(doned);
20414
+ validation.fail(failed);
20415
+ return validation;
20416
+ },
20417
+ validate: function(doned, failed) {
20418
+ var results, validator, _i, _len, _ref;
20435
20419
 
20436
- manager = {
20437
- validators: {}
20438
- };
20420
+ if (this.validated && !this.dirty) {
20421
+ return this.validation;
20422
+ }
20423
+ this.errors.clear();
20424
+ results = [this];
20425
+ _ref = model[this.resource.toString()].validators;
20426
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
20427
+ validator = _ref[_i];
20428
+ results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));
20429
+ }
20430
+ this.validation = jQuery.when.apply(jQuery, results);
20431
+ this.validation.done(doned);
20432
+ this.validation.fail(failed);
20433
+ return this.validation.done(function(record) {
20434
+ var old_dirty;
20435
+
20436
+ old_dirty = record.dirty;
20437
+ record.dirty = null;
20438
+ record.validated || (record.validated = true);
20439
+ record.dirty = old_dirty;
20440
+ return record;
20441
+ });
20442
+ }
20443
+ }
20444
+ };
20439
20445
 
20440
- model.mix(function(modelable) {
20441
- jQuery.extend(modelable, extensions.model);
20442
- jQuery.extend(modelable.record, extensions.record);
20443
- modelable.after_mix.unshift(initializers.create_validators);
20444
- modelable.record.after_initialize.push(initializers.define_triggers);
20445
- return model.validators = manager.validators;
20446
- });
20446
+ manager = {
20447
+ validators: {}
20448
+ };
20447
20449
 
20448
- manager.validators.confirmation = require('./validations/confirmation');
20450
+ model.mix(function(modelable) {
20451
+ jQuery.extend(modelable, extensions.model);
20452
+ jQuery.extend(modelable.record, extensions.record);
20453
+ modelable.after_mix.unshift(initializers.create_validators);
20454
+ modelable.record.after_initialize.push(initializers.define_triggers);
20455
+ return model.validators = manager.validators;
20456
+ });
20449
20457
 
20450
- manager.validators.associated = require('./validations/associated');
20458
+ manager.validators.confirmation = require('./validations/confirmation');
20451
20459
 
20452
- manager.validators.presence = require('./validations/presence');
20460
+ manager.validators.associated = require('./validations/associated');
20453
20461
 
20454
- manager.validators.remote = require('./validations/remote');
20462
+ manager.validators.presence = require('./validations/presence');
20455
20463
 
20456
- manager.validators.type = require('./validations/type');
20464
+ manager.validators.remote = require('./validations/remote');
20457
20465
 
20458
- manager.validators.cpf = require('./validations/cpf');
20466
+ manager.validators.type = require('./validations/type');
20459
20467
 
20460
- }).call(this);
20468
+ manager.validators.cpf = require('./validations/cpf');
20461
20469
 
20462
20470
  });
20463
20471
  require.register("indefinido-indemma/lib/extensions/rivets.js", function(exports, require, module){
@@ -32106,54 +32114,11 @@ require.register("ened/vendor/assets/javascripts/polyfills/es6-map-shim.js", fun
32106
32114
  }.call(this, window));
32107
32115
 
32108
32116
  });
32109
-
32110
-
32111
-
32112
-
32113
-
32114
-
32115
-
32116
-
32117
-
32118
-
32119
-
32120
-
32121
-
32122
-
32123
-
32124
-
32125
-
32126
-
32127
-
32128
-
32129
-
32130
-
32131
-
32132
-
32133
-
32134
-
32135
-
32136
-
32137
-
32138
-
32139
-
32140
-
32141
-
32142
-
32143
-
32144
-
32145
-
32146
-
32147
-
32148
-
32149
-
32150
-
32151
-
32152
-
32153
32117
  require.alias("mikeric-rivets/dist/rivets.js", "ened/deps/rivets/dist/rivets.js");
32154
32118
  require.alias("mikeric-rivets/dist/rivets.js", "ened/deps/rivets/index.js");
32155
32119
  require.alias("mikeric-rivets/dist/rivets.js", "rivets/index.js");
32156
32120
  require.alias("mikeric-rivets/dist/rivets.js", "mikeric-rivets/index.js");
32121
+
32157
32122
  require.alias("segmentio-extend/index.js", "ened/deps/extend/index.js");
32158
32123
  require.alias("segmentio-extend/index.js", "extend/index.js");
32159
32124
 
@@ -32161,10 +32126,12 @@ require.alias("pluma-assimilate/dist/assimilate.js", "ened/deps/assimilate/dist/
32161
32126
  require.alias("pluma-assimilate/dist/assimilate.js", "ened/deps/assimilate/index.js");
32162
32127
  require.alias("pluma-assimilate/dist/assimilate.js", "assimilate/index.js");
32163
32128
  require.alias("pluma-assimilate/dist/assimilate.js", "pluma-assimilate/index.js");
32129
+
32164
32130
  require.alias("paulmillr-es6-shim/es6-shim.js", "ened/deps/es6-shim/es6-shim.js");
32165
32131
  require.alias("paulmillr-es6-shim/es6-shim.js", "ened/deps/es6-shim/index.js");
32166
32132
  require.alias("paulmillr-es6-shim/es6-shim.js", "es6-shim/index.js");
32167
32133
  require.alias("paulmillr-es6-shim/es6-shim.js", "paulmillr-es6-shim/index.js");
32134
+
32168
32135
  require.alias("component-type/index.js", "ened/deps/type/index.js");
32169
32136
  require.alias("component-type/index.js", "type/index.js");
32170
32137
 
@@ -32182,6 +32149,7 @@ require.alias("components-modernizr/modernizr.js", "ened/deps/modernizr/moderniz
32182
32149
  require.alias("components-modernizr/modernizr.js", "ened/deps/modernizr/index.js");
32183
32150
  require.alias("components-modernizr/modernizr.js", "modernizr/index.js");
32184
32151
  require.alias("components-modernizr/modernizr.js", "components-modernizr/index.js");
32152
+
32185
32153
  require.alias("indefinido-indemma/index.js", "ened/deps/indemma/index.js");
32186
32154
  require.alias("indefinido-indemma/vendor/stampit.js", "ened/deps/indemma/vendor/stampit.js");
32187
32155
  require.alias("indefinido-indemma/vendor/sinon.js", "ened/deps/indemma/vendor/sinon.js");
@@ -32210,6 +32178,7 @@ require.alias("indefinido-indemma/index.js", "indemma/index.js");
32210
32178
  require.alias("pluma-assimilate/dist/assimilate.js", "indefinido-indemma/deps/assimilate/dist/assimilate.js");
32211
32179
  require.alias("pluma-assimilate/dist/assimilate.js", "indefinido-indemma/deps/assimilate/index.js");
32212
32180
  require.alias("pluma-assimilate/dist/assimilate.js", "pluma-assimilate/index.js");
32181
+
32213
32182
  require.alias("component-type/index.js", "indefinido-indemma/deps/type/index.js");
32214
32183
 
32215
32184
  require.alias("component-bind/index.js", "indefinido-indemma/deps/bind/index.js");
@@ -32284,4 +32253,6 @@ require.alias("component-value/index.js", "component-dom/deps/value/index.js");
32284
32253
  require.alias("component-type/index.js", "component-value/deps/type/index.js");
32285
32254
 
32286
32255
  require.alias("component-value/index.js", "component-value/index.js");
32256
+
32287
32257
  require.alias("component-query/index.js", "component-dom/deps/query/index.js");
32258
+