오윤석

Merge branch 'feature/2-character_page' into develop

...@@ -6,6 +6,6 @@ let routes = require('./routes'); ...@@ -6,6 +6,6 @@ let routes = require('./routes');
6 app.use(bodyParser.urlencoded({ extended: false })); 6 app.use(bodyParser.urlencoded({ extended: false }));
7 app.use(bodyParser.json()); 7 app.use(bodyParser.json());
8 8
9 -app.get('/api/home', routes.home); 9 +app.get('/api/character', routes.character.getCharacter);
10 10
11 let server = app.listen(80); 11 let server = app.listen(80);
...\ No newline at end of file ...\ No newline at end of file
......
1 +module.exports = {
2 + default: {
3 + jobConst: 1,
4 + stats: {
5 + passive: { // 데몬슬레이어, 키네시스, 시그너스 링크는 스탯창에 반영되었으므로 제외
6 + major: {
7 + percent: 0, // 제논 링크는 수치가 이상하게 나오기 때문에 제외
8 + added: 200 // 유니온 공격대원 평균
9 + },
10 + damage: {
11 + all: 10 // 데몬어벤져
12 + },
13 + criticalDamage: 0
14 + },
15 + active: {
16 + attackPower: {
17 + percent: 4 // 영웅의메아리
18 + },
19 + damage: {
20 + all: 137, // 아크, 일리움, 모험가마법사, 모험가도적, 카데나, 엔젤릭버스터, 길드노블레스
21 + boss: 22 // 길드노블레스
22 + },
23 + ignoreGuard: 9, // 모험가마법사
24 + criticalDamage: 30 // 길드노블레스
25 + }
26 + }
27 + },
28 + '전사/히어로': {
29 + major: 'STR',
30 + minor: 'DEX',
31 + jobConst: 1.0746,
32 + stats: {
33 + passive: {
34 + major: {
35 + percent: 0
36 + },
37 + attackPower: {
38 + percent: 0
39 + },
40 + damage: {
41 + all: 0
42 + },
43 + finalDamage: 10
44 + },
45 + active: {
46 + major: {
47 + pure: 0,
48 + percent: 15
49 + },
50 + attackPower: {
51 + pure: 50,
52 + percent: 0
53 + },
54 + damage: {
55 + all: 10,
56 + boss: 20
57 + },
58 + ignoreGuard: 15,
59 + criticalDamage: 28
60 + }
61 + }
62 + },
63 + '전사/팔라딘': {
64 + major: 'STR',
65 + minor: 'DEX',
66 + jobConst: 1,
67 + stats: {
68 + passive: {
69 + major: {
70 + percent: 0
71 + },
72 + attackPower: {
73 + percent: 0
74 + },
75 + damage: {
76 + all: 0
77 + },
78 + finalDamage: 72
79 + },
80 + active: {
81 + major: {
82 + pure: 0,
83 + percent: 16
84 + },
85 + attackPower: {
86 + pure: 100,
87 + percent: 0
88 + },
89 + damage: {
90 + all: 35,
91 + boss: 0
92 + },
93 + ignoreGuard: 57.5,
94 + criticalDamage: 8
95 + }
96 + }
97 + },
98 + '전사/다크나이트': {
99 + major: 'STR',
100 + minor: 'DEX',
101 + jobConst: 1,
102 + stats: {
103 + passive: {
104 + major: {
105 + percent: 0
106 + },
107 + attackPower: {
108 + percent: 0
109 + },
110 + damage: {
111 + all: 5
112 + },
113 + finalDamage: 95
114 + },
115 + active: {
116 + major: {
117 + pure: 0,
118 + percent: 15
119 + },
120 + attackPower: {
121 + pure: 70,
122 + percent: 0
123 + },
124 + damage: {
125 + all: 0,
126 + boss: 10
127 + },
128 + ignoreGuard: 10,
129 + criticalDamage: 8
130 + }
131 + }
132 + },
133 + '마법사/비숍': {
134 + major: 'INT',
135 + minor: 'LUK',
136 + jobConst: 1.2,
137 + stats: {
138 + passive: {
139 + major: {
140 + percent: 0
141 + },
142 + attackPower: {
143 + percent: 0
144 + },
145 + damage: {
146 + all: 40 // 벤전스 오브 엔젤 off
147 + },
148 + finalDamage: 0
149 + },
150 + active: {
151 + major: {
152 + pure: 0,
153 + percent: 15
154 + },
155 + attackPower: {
156 + pure: 80,
157 + percent: 0
158 + },
159 + damage: {
160 + all: 10, // 벤전스 오브 엔젤 on -40
161 + boss: 10
162 + },
163 + ignoreGuard: 64,
164 + criticalDamage: 8
165 + }
166 + }
167 + },
168 + '마법사/아크메이지(불,독)': {
169 + major: 'INT',
170 + minor: 'LUK',
171 + jobConst: 1.2,
172 + stats: {
173 + passive: {
174 + major: {
175 + percent: 0
176 + },
177 + attackPower: {
178 + percent: 0
179 + },
180 + damage: {
181 + all: 50
182 + },
183 + finalDamage: 40
184 + },
185 + active: {
186 + major: {
187 + pure: 0,
188 + percent: 15
189 + },
190 + attackPower: {
191 + pure: 30,
192 + percent: 0
193 + },
194 + damage: {
195 + all: 50,
196 + boss: 0
197 + },
198 + ignoreGuard: 20,
199 + criticalDamage: 8
200 + }
201 + }
202 + },
203 + '마법사/아크메이지(썬,콜)': {
204 + major: 'INT',
205 + minor: 'LUK',
206 + jobConst: 1.2,
207 + stats: {
208 + passive: {
209 + major: {
210 + percent: 0
211 + },
212 + attackPower: {
213 + percent: 0
214 + },
215 + damage: {
216 + all: 50
217 + },
218 + finalDamage: 50
219 + },
220 + active: {
221 + major: {
222 + pure: 0,
223 + percent: 15
224 + },
225 + attackPower: {
226 + pure: 30,
227 + percent: 0
228 + },
229 + damage: {
230 + all: 50,
231 + boss: 0
232 + },
233 + ignoreGuard: 32, // 프로즌 브레이크 무시
234 + criticalDamage: 8
235 + }
236 + }
237 + },
238 + '궁수/신궁': {
239 + major: 'DEX',
240 + minor: 'STR',
241 + jobConst: 1,
242 + stats: {
243 + passive: {
244 + major: {
245 + percent: 0
246 + },
247 + attackPower: {
248 + percent: 0
249 + },
250 + damage: {
251 + all: 15
252 + },
253 + finalDamage: 0
254 + },
255 + active: {
256 + major: {
257 + pure: 40,
258 + percent: 15
259 + },
260 + attackPower: {
261 + pure: 30,
262 + percent: 0
263 + },
264 + damage: {
265 + all: 30,
266 + boss: 0
267 + },
268 + ignoreGuard: 60,
269 + criticalDamage: 25
270 + }
271 + }
272 + },
273 + '궁수/보우마스터': {
274 + major: 'DEX',
275 + minor: 'STR',
276 + jobConst: 1,
277 + stats: {
278 + passive: {
279 + major: {
280 + percent: 0
281 + },
282 + attackPower: {
283 + percent: 25
284 + },
285 + damage: {
286 + all: 0
287 + },
288 + finalDamage: 0
289 + },
290 + active: {
291 + major: {
292 + pure: 80,
293 + percent: 15
294 + },
295 + attackPower: {
296 + pure: 120,
297 + percent: 20
298 + },
299 + damage: {
300 + all: 40,
301 + boss: 20
302 + },
303 + ignoreGuard: 0,
304 + criticalDamage: 15
305 + }
306 + }
307 + },
308 + '궁수/패스파인더': {
309 + major: 'DEX',
310 + minor: 'STR',
311 + jobConst: 1,
312 + stats: {
313 + passive: {
314 + major: {
315 + percent: 0
316 + },
317 + attackPower: {
318 + percent: 20
319 + },
320 + damage: {
321 + all: 10
322 + },
323 + finalDamage: 0
324 + },
325 + active: {
326 + major: {
327 + pure: 0,
328 + percent: 15
329 + },
330 + attackPower: {
331 + pure: 0,
332 + percent: 0
333 + },
334 + damage: {
335 + all: 0,
336 + boss: 0
337 + },
338 + ignoreGuard: 0,
339 + criticalDamage: 15
340 + }
341 + }
342 + },
343 + '도적/섀도어': {
344 + major: 'LUK',
345 + minor: 'DEX',
346 + jobConst: 1,
347 + stats: {
348 + passive: {
349 + major: {
350 + percent: 0
351 + },
352 + attackPower: {
353 + percent: 0
354 + },
355 + damage: {
356 + all: 0
357 + },
358 + finalDamage: 25
359 + },
360 + active: {
361 + major: {
362 + pure: 0,
363 + percent: 15
364 + },
365 + attackPower: {
366 + pure: 70,
367 + percent: 0
368 + },
369 + damage: {
370 + all: 35,
371 + boss: 0
372 + },
373 + ignoreGuard: 0,
374 + criticalDamage: 28
375 + }
376 + }
377 + },
378 + '도적/나이트로드': {
379 + major: 'LUK',
380 + minor: 'DEX',
381 + jobConst: 1,
382 + stats: {
383 + passive: {
384 + major: {
385 + percent: 0
386 + },
387 + attackPower: {
388 + percent: 0
389 + },
390 + damage: {
391 + all: 0
392 + },
393 + finalDamage: 25
394 + },
395 + active: {
396 + major: {
397 + pure: 0,
398 + percent: 15
399 + },
400 + attackPower: {
401 + pure: 60,
402 + percent: 0
403 + },
404 + damage: {
405 + all: 10,
406 + boss: 0
407 + },
408 + ignoreGuard: 30,
409 + criticalDamage: 8
410 + }
411 + }
412 + },
413 + '도적/듀얼블레이더': {
414 + major: 'LUK',
415 + minor: 'DEX',
416 + jobConst: 1,
417 + stats: {
418 + passive: {
419 + major: {
420 + percent: 0
421 + },
422 + attackPower: {
423 + percent: 0
424 + },
425 + damage: {
426 + all: 0
427 + },
428 + finalDamage: 20
429 + },
430 + active: {
431 + major: {
432 + pure: 0,
433 + percent: 15
434 + },
435 + attackPower: {
436 + pure: 0,
437 + percent: 0
438 + },
439 + damage: {
440 + all: 20,
441 + boss: 0
442 + },
443 + ignoreGuard: 0,
444 + criticalDamage: 8
445 + }
446 + }
447 + },
448 + '해적/바이퍼': {
449 + major: 'STR',
450 + minor: 'DEX',
451 + jobConst: 1,
452 + stats: {
453 + passive: {
454 + major: {
455 + percent: 0
456 + },
457 + attackPower: {
458 + percent: 0
459 + },
460 + damage: {
461 + all: 0
462 + },
463 + finalDamage: 0
464 + },
465 + active: {
466 + major: {
467 + pure: 0,
468 + percent: 15 // 파이렛 플래그 무시
469 + },
470 + attackPower: {
471 + pure: 50,
472 + percent: 30 // 오버드라이브 무시
473 + },
474 + damage: {
475 + all: 50,
476 + boss: 0
477 + },
478 + ignoreGuard: 55, // 가드 크러쉬 40 적용
479 + criticalDamage: 48
480 + }
481 + }
482 + },
483 + '해적/캡틴': {
484 + major: 'DEX',
485 + minor: 'STR',
486 + jobConst: 1,
487 + stats: {
488 + passive: {
489 + major: {
490 + percent: 0
491 + },
492 + attackPower: {
493 + percent: 0
494 + },
495 + damage: {
496 + all: 0
497 + },
498 + finalDamage: 20
499 + },
500 + active: {
501 + major: {
502 + pure: 0,
503 + percent: 15 // 파이렛 플래그 무시
504 + },
505 + attackPower: {
506 + pure: 45,
507 + percent: 20 // 오버드라이브 무시
508 + },
509 + damage: {
510 + all: 45,
511 + boss: 0
512 + },
513 + ignoreGuard: 25,
514 + criticalDamage: 13
515 + }
516 + }
517 + },
518 + '해적/캐논마스터': {
519 + major: 'STR',
520 + minor: 'DEX',
521 + jobConst: 1,
522 + stats: {
523 + passive: {
524 + major: {
525 + percent: 0
526 + },
527 + attackPower: {
528 + percent: 0
529 + },
530 + damage: {
531 + all: 0
532 + },
533 + finalDamage: 43
534 + },
535 + active: {
536 + major: {
537 + pure: 60,
538 + percent: 15 // 파이렛 플래그 무시
539 + },
540 + attackPower: {
541 + pure: 0,
542 + percent: 0 // 오버드라이브 무시
543 + },
544 + damage: {
545 + all: 70,
546 + boss: 0
547 + },
548 + ignoreGuard: 25,
549 + criticalDamage: 18
550 + }
551 + }
552 + },
553 + '기사단/미하일': {
554 + major: 'STR',
555 + minor: 'DEX',
556 + jobConst: 1,
557 + stats: {
558 + passive: {
559 + major: {
560 + percent: 0
561 + },
562 + attackPower: {
563 + percent: 10
564 + },
565 + damage: {
566 + all: 60
567 + },
568 + finalDamage: 26
569 + },
570 + active: {
571 + major: {
572 + pure: 0,
573 + percent: 15
574 + },
575 + attackPower: {
576 + pure: 75,
577 + percent: 0
578 + },
579 + damage: {
580 + all: 30,
581 + boss: 0
582 + },
583 + ignoreGuard: 15,
584 + criticalDamage: 16
585 + }
586 + }
587 + },
588 + '기사단/소울마스터': {
589 + major: 'STR',
590 +
591 + minor: 'DEX',
592 + jobConst: 1,
593 + stats: {
594 + passive: {
595 + major: {
596 + percent: 0
597 + },
598 + attackPower: {
599 + percent: 10
600 + },
601 + damage: {
602 + all: 0
603 + },
604 + finalDamage: 25
605 + },
606 + active: {
607 + major: {
608 + pure: 0,
609 + percent: 15
610 + },
611 + attackPower: {
612 + pure: 50,
613 + percent: 0
614 + },
615 + damage: {
616 + all: 10,
617 + boss: 0
618 + },
619 + ignoreGuard: 32,
620 + criticalDamage: 8
621 + }
622 + }
623 + },
624 + '기사단/플레임위자드': {
625 + major: 'INT',
626 + minor: 'LUK',
627 + jobConst: 1.2,
628 + stats: {
629 + passive: {
630 + major: {
631 + percent: 0
632 + },
633 + attackPower: {
634 + percent: 10
635 + },
636 + damage: {
637 + all: 0
638 + },
639 + finalDamage: 95
640 + },
641 + active: {
642 + major: {
643 + pure: 0,
644 + percent: 15
645 + },
646 + attackPower: {
647 + pure: 60,
648 + percent: 0
649 + },
650 + damage: {
651 + all: 70,
652 + boss: 0
653 + },
654 + ignoreGuard: 30,
655 + criticalDamage: 8
656 + }
657 + }
658 + },
659 + '기사단/윈드브레이커': {
660 + major: 'DEX',
661 + minor: 'STR',
662 + jobConst: 1,
663 + stats: {
664 + passive: {
665 + major: {
666 + percent: 15
667 + },
668 + attackPower: {
669 + percent: 20
670 + },
671 + damage: {
672 + all: 0
673 + },
674 + finalDamage: 25
675 + },
676 + active: {
677 + major: {
678 + pure: 0,
679 + percent: 15
680 + },
681 + attackPower: {
682 + pure: 85,
683 + percent: 0
684 + },
685 + damage: {
686 + all: 45,
687 + boss: 0
688 + },
689 + ignoreGuard: 15,
690 + criticalDamage: 15
691 + }
692 + }
693 + },
694 + '기사단/나이트워커': {
695 + major: 'LUK',
696 + minor: 'DEX',
697 + jobConst: 1,
698 + stats: {
699 + passive: {
700 + major: {
701 + percent: 0
702 + },
703 + attackPower: {
704 + percent: 10
705 + },
706 + damage: {
707 + all: 30
708 + },
709 + finalDamage: 0
710 + },
711 + active: {
712 + major: {
713 + pure: 0,
714 + percent: 15
715 + },
716 + attackPower: {
717 + pure: 0,
718 + percent: 0
719 + },
720 + damage: {
721 + all: 10,
722 + boss: 0
723 + },
724 + ignoreGuard: 35,
725 + criticalDamage: 8
726 + }
727 + }
728 + },
729 + '기사단/스트라이커': {
730 + major: 'STR',
731 + minor: 'DEX',
732 + jobConst: 1,
733 + stats: {
734 + passive: {
735 + major: {
736 + percent: 0
737 + },
738 + attackPower: {
739 + percent: 10
740 + },
741 + damage: {
742 + all: 5
743 + },
744 + finalDamage: 20
745 + },
746 + active: {
747 + major: {
748 + pure: 0,
749 + percent: 15
750 + },
751 + attackPower: {
752 + pure: 0,
753 + percent: 0 // 오버드라이브 무시
754 + },
755 + damage: {
756 + all: 65,
757 + boss: 0
758 + },
759 + ignoreGuard: 45,
760 + criticalDamage: 8
761 + }
762 + }
763 + },
764 + '아란/아란': {
765 + major: 'STR',
766 + minor: 'DEX',
767 + jobConst: 1,
768 + stats: {
769 + passive: {
770 + major: {
771 + percent: 0
772 + },
773 + attackPower: {
774 + percent: 5
775 + },
776 + damage: {
777 + all: 20
778 + },
779 + finalDamage: 0
780 + },
781 + active: {
782 + major: {
783 + pure: 0,
784 + percent: 15
785 + },
786 + attackPower: {
787 + pure: 70,
788 + percent: 35
789 + },
790 + damage: {
791 + all: 40,
792 + boss: 0
793 + },
794 + ignoreGuard: 15,
795 + criticalDamage: 8
796 + }
797 + }
798 + },
799 + '에반/에반': {
800 + major: 'INT',
801 + minor: 'LUK',
802 + jobConst: 1,
803 + stats: {
804 + passive: {
805 + major: {
806 + percent: 0
807 + },
808 + attackPower: {
809 + percent: 35
810 + },
811 + damage: {
812 + all: 0
813 + },
814 + finalDamage: 50
815 + },
816 + active: {
817 + major: {
818 + pure: 0,
819 + percent: 15
820 + },
821 + attackPower: {
822 + pure: 80,
823 + percent: 0
824 + },
825 + damage: {
826 + all: 10,
827 + boss: 0
828 + },
829 + ignoreGuard: 0,
830 + criticalDamage: 8
831 + }
832 + }
833 + },
834 + '루미너스/루미너스': {
835 + major: 'INT',
836 + minor: 'LUK',
837 + jobConst: 1,
838 + stats: {
839 + passive: {
840 + major: {
841 + percent: 0
842 + },
843 + attackPower: {
844 + percent: 0
845 + },
846 + damage: {
847 + all: 0
848 + },
849 + finalDamage: 82
850 + },
851 + active: {
852 + major: {
853 + pure: 0,
854 + percent: 15
855 + },
856 + attackPower: {
857 + pure: 70,
858 + percent: 0
859 + },
860 + damage: {
861 + all: 40,
862 + boss: 0
863 + },
864 + ignoreGuard: 0,
865 + criticalDamage: 8
866 + }
867 + }
868 + },
869 + '메르세데스/메르세데스': {
870 + major: 'DEX',
871 + minor: 'STR',
872 + jobConst: 1,
873 + stats: {
874 + passive: {
875 + major: {
876 + percent: 0
877 + },
878 + attackPower: {
879 + percent: 0
880 + },
881 + damage: {
882 + all: 50
883 + },
884 + finalDamage: 38
885 + },
886 + active: {
887 + major: {
888 + pure: 0,
889 + percent: 15
890 + },
891 + attackPower: {
892 + pure: 80,
893 + percent: 30
894 + },
895 + damage: {
896 + all: 40,
897 + boss: 0
898 + },
899 + ignoreGuard: 50,
900 + criticalDamage: 8
901 + }
902 + }
903 + },
904 + '팬텀/팬텀': {
905 + major: 'LUK',
906 + minor: 'DEX',
907 + jobConst: 1,
908 + stats: {
909 + passive: {
910 + major: {
911 + percent: 0
912 + },
913 + attackPower: {
914 + percent: 0
915 + },
916 + damage: {
917 + all: 0
918 + },
919 + finalDamage: 63
920 + },
921 + active: {
922 + major: {
923 + pure: 0,
924 + percent: 15
925 + },
926 + attackPower: {
927 + pure: 30, // 분노
928 + percent: 0
929 + },
930 + damage: {
931 + all: 40,
932 + boss: 0
933 + },
934 + ignoreGuard: 44,
935 + criticalDamage: 8
936 + }
937 + }
938 + },
939 + '은월/은월': {
940 + major: 'STR',
941 + minor: 'DEX',
942 + jobConst: 1,
943 + stats: {
944 + passive: {
945 + major: {
946 + percent: 0
947 + },
948 + attackPower: {
949 + percent: 0
950 + },
951 + damage: {
952 + all: 20
953 + },
954 + finalDamage: 26
955 + },
956 + active: {
957 + major: {
958 + pure: 0,
959 + percent: 15
960 + },
961 + attackPower: {
962 + pure: 0,
963 + percent: 0 // 오버드라이브 무시
964 + },
965 + damage: {
966 + all: 65,
967 + boss: 20
968 + },
969 + ignoreGuard: 20,
970 + criticalDamage: 8
971 + }
972 + }
973 + },
974 + '레지스탕스/블래스터': {
975 + major: 'STR',
976 + minor: 'DEX',
977 + jobConst: 1,
978 + stats: {
979 + passive: {
980 + major: {
981 + percent: 0
982 + },
983 + attackPower: {
984 + percent: 15
985 + },
986 + damage: {
987 + all: 20
988 + },
989 + finalDamage: 0
990 + },
991 + active: {
992 + major: {
993 + pure: 0,
994 + percent: 15
995 + },
996 + attackPower: {
997 + pure: 0,
998 + percent: 0
999 + },
1000 + damage: {
1001 + all: 10,
1002 + boss: 0
1003 + },
1004 + ignoreGuard: 15,
1005 + criticalDamage: 8
1006 + }
1007 + }
1008 + },
1009 + '레지스탕스/데몬슬레이어': {
1010 + major: 'STR',
1011 + minor: 'DEX',
1012 + jobConst: 1,
1013 + stats: {
1014 + passive: {
1015 + major: {
1016 + percent: 0
1017 + },
1018 + attackPower: {
1019 + percent: 0
1020 + },
1021 + damage: {
1022 + all: 0
1023 + },
1024 + finalDamage: 25
1025 + },
1026 + active: {
1027 + major: {
1028 + pure: 0,
1029 + percent: 15
1030 + },
1031 + attackPower: {
1032 + pure: 0,
1033 + percent: 0
1034 + },
1035 + damage: {
1036 + all: 45,
1037 + boss: 0
1038 + },
1039 + ignoreGuard: 27,
1040 + criticalDamage: 8
1041 + }
1042 + }
1043 + },
1044 + '레지스탕스/배틀메이지': {
1045 + major: 'INT',
1046 + minor: 'LUK',
1047 + jobConst: 1,
1048 + stats: {
1049 + passive: {
1050 + major: {
1051 + percent: 0
1052 + },
1053 + attackPower: {
1054 + percent: 40
1055 + },
1056 + damage: {
1057 + all: 10
1058 + },
1059 + finalDamage: 15
1060 + },
1061 + active: {
1062 + major: {
1063 + pure: 0,
1064 + percent: 15
1065 + },
1066 + attackPower: {
1067 + pure: 60,
1068 + percent: 0
1069 + },
1070 + damage: {
1071 + all: 50,
1072 + boss: 0
1073 + },
1074 + ignoreGuard: 20,
1075 + criticalDamage: 16
1076 + }
1077 + }
1078 + },
1079 + '레지스탕스/와일드헌터': {
1080 + major: 'DEX',
1081 + minor: 'STR',
1082 + jobConst: 1,
1083 + stats: {
1084 + passive: {
1085 + major: {
1086 + percent: 0
1087 + },
1088 + attackPower: {
1089 + percent: 0
1090 + },
1091 + damage: {
1092 + all: 10
1093 + },
1094 + finalDamage: 20
1095 + },
1096 + active: {
1097 + major: {
1098 + pure: 0,
1099 + percent: 15
1100 + },
1101 + attackPower: {
1102 + pure: 35,
1103 + percent: 20
1104 + },
1105 + damage: {
1106 + all: 10,
1107 + boss: 10
1108 + },
1109 + ignoreGuard: 0,
1110 + criticalDamage: 23
1111 + }
1112 + }
1113 + },
1114 + '레지스탕스/메카닉': {
1115 + major: 'DEX',
1116 + minor: 'STR',
1117 + jobConst: 1,
1118 + stats: {
1119 + passive: {
1120 + major: {
1121 + percent: 0
1122 + },
1123 + attackPower: {
1124 + percent: 0
1125 + },
1126 + damage: {
1127 + all: 10
1128 + },
1129 + finalDamage: 20
1130 + },
1131 + active: {
1132 + major: {
1133 + pure: 0,
1134 + percent: 15
1135 + },
1136 + attackPower: {
1137 + pure: 55,
1138 + percent: 0 // 오버드라이브 무시
1139 + },
1140 + damage: {
1141 + all: 60,
1142 + boss: 0
1143 + },
1144 + ignoreGuard: 10,
1145 + criticalDamage: 8
1146 + }
1147 + }
1148 + },
1149 + '카이저/카이저': {
1150 + major: 'STR',
1151 + minor: 'DEX',
1152 + jobConst: 1,
1153 + stats: {
1154 + passive: {
1155 + major: {
1156 + percent: 0
1157 + },
1158 + attackPower: {
1159 + percent: 30
1160 + },
1161 + damage: {
1162 + all: 0
1163 + },
1164 + finalDamage: 20
1165 + },
1166 + active: {
1167 + major: {
1168 + pure: 0,
1169 + percent: 15
1170 + },
1171 + attackPower: {
1172 + pure: 95,
1173 + percent: 0
1174 + },
1175 + damage: {
1176 + all: 9,
1177 + boss: 0
1178 + },
1179 + ignoreGuard: 15,
1180 + criticalDamage: 8
1181 + }
1182 + }
1183 + },
1184 + '카데나/카데나': {
1185 + major: 'LUK',
1186 + minor: 'DEX',
1187 + jobConst: 1,
1188 + stats: {
1189 + passive: {
1190 + major: {
1191 + percent: 0
1192 + },
1193 + attackPower: {
1194 + percent: 0
1195 + },
1196 + damage: {
1197 + all: 0
1198 + },
1199 + finalDamage: 0
1200 + },
1201 + active: {
1202 + major: {
1203 + pure: 0,
1204 + percent: 15
1205 + },
1206 + attackPower: {
1207 + pure: 0,
1208 + percent: 0
1209 + },
1210 + damage: {
1211 + all: 10,
1212 + boss: 0
1213 + },
1214 + ignoreGuard: 30,
1215 + criticalDamage: 58
1216 + }
1217 + }
1218 + },
1219 + '엔젤릭버스터/엔젤릭버스터': {
1220 + major: 'DEX',
1221 + minor: 'STR',
1222 + jobConst: 1,
1223 + stats: {
1224 + passive: {
1225 + major: {
1226 + percent: 0
1227 + },
1228 + attackPower: {
1229 + percent: 0
1230 + },
1231 + damage: {
1232 + all: 20
1233 + },
1234 + finalDamage: 0
1235 + },
1236 + active: {
1237 + major: {
1238 + pure: 0,
1239 + percent: 15
1240 + },
1241 + attackPower: {
1242 + pure: 50,
1243 + percent: 0
1244 + },
1245 + damage: {
1246 + all: 85, // 소울 컨트랙트 추가치, 어피니티4 1스택
1247 + boss: 20
1248 + },
1249 + ignoreGuard: 30,
1250 + criticalDamage: 53
1251 + }
1252 + }
1253 + },
1254 + '아크/아크': {
1255 + major: 'STR',
1256 + minor: 'DEX',
1257 + jobConst: 1,
1258 + stats: {
1259 + passive: {
1260 + major: {
1261 + percent: 0
1262 + },
1263 + attackPower: {
1264 + percent: 0
1265 + },
1266 + damage: {
1267 + all: 0
1268 + },
1269 + finalDamage: 32
1270 + },
1271 + active: {
1272 + major: {
1273 + pure: 0,
1274 + percent: 15
1275 + },
1276 + attackPower: {
1277 + pure: 90,
1278 + percent: 0 // 오버드라이브 제외
1279 + },
1280 + damage: {
1281 + all: 70,
1282 + boss: 60
1283 + },
1284 + ignoreGuard: 36,
1285 + criticalDamage: 8
1286 + }
1287 + }
1288 + },
1289 + '일리움/일리움': {
1290 + major: 'INT',
1291 + minor: 'LUK',
1292 + jobConst: 1,
1293 + stats: {
1294 + passive: {
1295 + major: {
1296 + percent: 0
1297 + },
1298 + attackPower: {
1299 + percent: 10
1300 + },
1301 + damage: {
1302 + all: 20
1303 + },
1304 + finalDamage: 35
1305 + },
1306 + active: {
1307 + major: {
1308 + pure: 0,
1309 + percent: 15
1310 + },
1311 + attackPower: {
1312 + pure: 46,
1313 + percent: 0
1314 + },
1315 + damage: {
1316 + all: 10,
1317 + boss: 60
1318 + },
1319 + ignoreGuard: 20,
1320 + criticalDamage: 8
1321 + }
1322 + }
1323 + },
1324 + '아델/아델': {
1325 + major: 'STR',
1326 + minor: 'DEX',
1327 + jobConst: 1,
1328 + stats: {
1329 + passive: {
1330 + major: {
1331 + percent: 0
1332 + },
1333 + attackPower: {
1334 + percent: 0
1335 + },
1336 + damage: {
1337 + all: 0
1338 + },
1339 + finalDamage: 50
1340 + },
1341 + active: {
1342 + major: {
1343 + pure: 0,
1344 + percent: 15
1345 + },
1346 + attackPower: {
1347 + pure: 0,
1348 + percent: 0
1349 + },
1350 + damage: {
1351 + all: 105,
1352 + boss: 0
1353 + },
1354 + ignoreGuard: 35,
1355 + criticalDamage: 8
1356 + }
1357 + }
1358 + },
1359 + '제로/제로': {
1360 + major: 'STR',
1361 + minor: 'DEX',
1362 + jobConst: 1,
1363 + stats: {
1364 + passive: {
1365 + major: {
1366 + percent: 0
1367 + },
1368 + attackPower: {
1369 + percent: 0
1370 + },
1371 + damage: {
1372 + all: 0
1373 + },
1374 + finalDamage: 25
1375 + },
1376 + active: {
1377 + major: {
1378 + pure: 0,
1379 + percent: 15
1380 + },
1381 + attackPower: {
1382 + pure: 0,
1383 + percent: 0
1384 + },
1385 + damage: {
1386 + all: 45,
1387 + boss: 0
1388 + },
1389 + ignoreGuard: 50,
1390 + criticalDamage: 8
1391 + }
1392 + }
1393 + },
1394 + '키네시스/키네시스': {
1395 + major: 'INT',
1396 + minor: 'LUK',
1397 + jobConst: 1,
1398 + stats: {
1399 + passive: {
1400 + major: {
1401 + percent: 0
1402 + },
1403 + attackPower: {
1404 + percent: 10
1405 + },
1406 + damage: {
1407 + all: 40
1408 + },
1409 + finalDamage: 25
1410 + },
1411 + active: {
1412 + major: {
1413 + pure: 0,
1414 + percent: 15
1415 + },
1416 + attackPower: {
1417 + pure: 0,
1418 + percent: 0
1419 + },
1420 + damage: {
1421 + all: 10,
1422 + boss: 0
1423 + },
1424 + ignoreGuard: 20,
1425 + criticalDamage: 28
1426 + }
1427 + }
1428 + },
1429 + '호영/호영': {
1430 + major: 'LUK',
1431 + minor: 'DEX',
1432 + jobConst: 1,
1433 + stats: {
1434 + passive: {
1435 + major: {
1436 + percent: 0
1437 + },
1438 + attackPower: {
1439 + percent: 10
1440 + },
1441 + damage: {
1442 + all: 10
1443 + },
1444 + finalDamage: 63
1445 + },
1446 + active: {
1447 + major: {
1448 + pure: 0,
1449 + percent: 15
1450 + },
1451 + attackPower: {
1452 + pure: 0,
1453 + percent: 0
1454 + },
1455 + damage: {
1456 + all: 70,
1457 + boss: 0
1458 + },
1459 + ignoreGuard: 20,
1460 + criticalDamage: 8
1461 + }
1462 + }
1463 + },
1464 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module.exports = {
2 + 'STR': {
3 + 'korean': '힘'
4 + },
5 + 'DEX': {
6 + 'korean': '민첩성'
7 + },
8 + 'INT': {
9 + 'korean': '지력'
10 + },
11 + 'LUK': {
12 + 'korean': '운'
13 + }
14 +}
...\ No newline at end of file ...\ No newline at end of file
1 +module.exports = {
2 + '한손검': 1.2,
3 + '한손도끼': 1.2,
4 + '한손둔기': 1.2,
5 + '스태프': 1,
6 + '완드': 1,
7 + '샤이닝 로드': 1.2,
8 + '단검': 1.3,
9 + '케인': 1.3,
10 + '데스페라도': 1.3,
11 + '에너지소드': 1.5,
12 + '소울 슈터': 1.7,
13 + 'ESP 리미터': 1.2,
14 + '체인': 1.3,
15 + '매직 건틀렛': 1.2,
16 + '부채': 1.3,
17 + '튜너': 1.3,
18 + '두손검': 1.34,
19 + '두손도끼': 1.34,
20 + '두손둔기': 1.34,
21 + '창': 1.34,
22 + '폴암': 1.49,
23 + '태도': 1.34,
24 + '건틀렛 리볼버': 1.7,
25 + '활': 1.3,
26 + '석궁': 1.35,
27 + '듀얼 보우건': 1.3,
28 + '에인션트 보우': 1.3,
29 + '아대': 1.75,
30 + '건': 1.5,
31 + '너클': 1.7,
32 + '핸드캐논': 1.5
33 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -22,6 +22,11 @@ ...@@ -22,6 +22,11 @@
22 "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 22 "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
23 "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 23 "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
24 }, 24 },
25 + "abab": {
26 + "version": "2.0.3",
27 + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
28 + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg=="
29 + },
25 "abbrev": { 30 "abbrev": {
26 "version": "1.1.1", 31 "version": "1.1.1",
27 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 32 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
...@@ -36,6 +41,36 @@ ...@@ -36,6 +41,36 @@
36 "negotiator": "0.6.2" 41 "negotiator": "0.6.2"
37 } 42 }
38 }, 43 },
44 + "acorn": {
45 + "version": "7.2.0",
46 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz",
47 + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ=="
48 + },
49 + "acorn-globals": {
50 + "version": "6.0.0",
51 + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
52 + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
53 + "requires": {
54 + "acorn": "^7.1.1",
55 + "acorn-walk": "^7.1.1"
56 + }
57 + },
58 + "acorn-walk": {
59 + "version": "7.1.1",
60 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
61 + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ=="
62 + },
63 + "ajv": {
64 + "version": "6.12.2",
65 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
66 + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
67 + "requires": {
68 + "fast-deep-equal": "^3.1.1",
69 + "fast-json-stable-stringify": "^2.0.0",
70 + "json-schema-traverse": "^0.4.1",
71 + "uri-js": "^4.2.2"
72 + }
73 + },
39 "ansi-align": { 74 "ansi-align": {
40 "version": "3.0.0", 75 "version": "3.0.0",
41 "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", 76 "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
...@@ -84,11 +119,55 @@ ...@@ -84,11 +119,55 @@
84 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 119 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
85 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 120 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
86 }, 121 },
122 + "asn1": {
123 + "version": "0.2.4",
124 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
125 + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
126 + "requires": {
127 + "safer-buffer": "~2.1.0"
128 + }
129 + },
130 + "assert-plus": {
131 + "version": "1.0.0",
132 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
133 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
134 + },
135 + "asynckit": {
136 + "version": "0.4.0",
137 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
138 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
139 + },
140 + "aws-sign2": {
141 + "version": "0.7.0",
142 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
143 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
144 + },
145 + "aws4": {
146 + "version": "1.10.0",
147 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
148 + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
149 + },
150 + "axios": {
151 + "version": "0.19.2",
152 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
153 + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
154 + "requires": {
155 + "follow-redirects": "1.5.10"
156 + }
157 + },
87 "balanced-match": { 158 "balanced-match": {
88 "version": "1.0.0", 159 "version": "1.0.0",
89 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 160 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
90 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 161 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
91 }, 162 },
163 + "bcrypt-pbkdf": {
164 + "version": "1.0.2",
165 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
166 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
167 + "requires": {
168 + "tweetnacl": "^0.14.3"
169 + }
170 + },
92 "binary-extensions": { 171 "binary-extensions": {
93 "version": "2.0.0", 172 "version": "2.0.0",
94 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 173 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
...@@ -143,6 +222,11 @@ ...@@ -143,6 +222,11 @@
143 "fill-range": "^7.0.1" 222 "fill-range": "^7.0.1"
144 } 223 }
145 }, 224 },
225 + "browser-process-hrtime": {
226 + "version": "1.0.0",
227 + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
228 + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
229 + },
146 "bytes": { 230 "bytes": {
147 "version": "3.1.0", 231 "version": "3.1.0",
148 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 232 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
...@@ -182,6 +266,11 @@ ...@@ -182,6 +266,11 @@
182 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 266 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
183 "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 267 "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
184 }, 268 },
269 + "caseless": {
270 + "version": "0.12.0",
271 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
272 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
273 + },
185 "chalk": { 274 "chalk": {
186 "version": "3.0.0", 275 "version": "3.0.0",
187 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 276 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
...@@ -252,6 +341,14 @@ ...@@ -252,6 +341,14 @@
252 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 341 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
253 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 342 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
254 }, 343 },
344 + "combined-stream": {
345 + "version": "1.0.8",
346 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
347 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
348 + "requires": {
349 + "delayed-stream": "~1.0.0"
350 + }
351 + },
255 "concat-map": { 352 "concat-map": {
256 "version": "0.0.1", 353 "version": "0.0.1",
257 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 354 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
...@@ -293,11 +390,54 @@ ...@@ -293,11 +390,54 @@
293 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 390 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
294 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 391 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
295 }, 392 },
393 + "core-util-is": {
394 + "version": "1.0.2",
395 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
396 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
397 + },
296 "crypto-random-string": { 398 "crypto-random-string": {
297 "version": "2.0.0", 399 "version": "2.0.0",
298 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 400 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
299 "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" 401 "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
300 }, 402 },
403 + "cssom": {
404 + "version": "0.4.4",
405 + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
406 + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
407 + },
408 + "cssstyle": {
409 + "version": "2.3.0",
410 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
411 + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
412 + "requires": {
413 + "cssom": "~0.3.6"
414 + },
415 + "dependencies": {
416 + "cssom": {
417 + "version": "0.3.8",
418 + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
419 + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
420 + }
421 + }
422 + },
423 + "dashdash": {
424 + "version": "1.14.1",
425 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
426 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
427 + "requires": {
428 + "assert-plus": "^1.0.0"
429 + }
430 + },
431 + "data-urls": {
432 + "version": "2.0.0",
433 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
434 + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
435 + "requires": {
436 + "abab": "^2.0.3",
437 + "whatwg-mimetype": "^2.3.0",
438 + "whatwg-url": "^8.0.0"
439 + }
440 + },
301 "debug": { 441 "debug": {
302 "version": "2.6.9", 442 "version": "2.6.9",
303 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 443 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -306,6 +446,11 @@ ...@@ -306,6 +446,11 @@
306 "ms": "2.0.0" 446 "ms": "2.0.0"
307 } 447 }
308 }, 448 },
449 + "decimal.js": {
450 + "version": "10.2.0",
451 + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz",
452 + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw=="
453 + },
309 "decompress-response": { 454 "decompress-response": {
310 "version": "3.3.0", 455 "version": "3.3.0",
311 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 456 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
...@@ -319,11 +464,21 @@ ...@@ -319,11 +464,21 @@
319 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 464 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
320 "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 465 "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
321 }, 466 },
467 + "deep-is": {
468 + "version": "0.1.3",
469 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
470 + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
471 + },
322 "defer-to-connect": { 472 "defer-to-connect": {
323 "version": "1.1.3", 473 "version": "1.1.3",
324 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 474 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
325 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 475 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
326 }, 476 },
477 + "delayed-stream": {
478 + "version": "1.0.0",
479 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
480 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
481 + },
327 "depd": { 482 "depd": {
328 "version": "1.1.2", 483 "version": "1.1.2",
329 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 484 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
...@@ -334,6 +489,21 @@ ...@@ -334,6 +489,21 @@
334 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 489 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
335 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 490 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
336 }, 491 },
492 + "domexception": {
493 + "version": "2.0.1",
494 + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
495 + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
496 + "requires": {
497 + "webidl-conversions": "^5.0.0"
498 + },
499 + "dependencies": {
500 + "webidl-conversions": {
501 + "version": "5.0.0",
502 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
503 + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
504 + }
505 + }
506 + },
337 "dot-prop": { 507 "dot-prop": {
338 "version": "5.2.0", 508 "version": "5.2.0",
339 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", 509 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
...@@ -347,6 +517,15 @@ ...@@ -347,6 +517,15 @@
347 "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 517 "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
348 "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 518 "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
349 }, 519 },
520 + "ecc-jsbn": {
521 + "version": "0.1.2",
522 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
523 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
524 + "requires": {
525 + "jsbn": "~0.1.0",
526 + "safer-buffer": "^2.1.0"
527 + }
528 + },
350 "ee-first": { 529 "ee-first": {
351 "version": "1.1.1", 530 "version": "1.1.1",
352 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 531 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
...@@ -380,6 +559,33 @@ ...@@ -380,6 +559,33 @@
380 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 559 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
381 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 560 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
382 }, 561 },
562 + "escodegen": {
563 + "version": "1.14.2",
564 + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz",
565 + "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==",
566 + "requires": {
567 + "esprima": "^4.0.1",
568 + "estraverse": "^4.2.0",
569 + "esutils": "^2.0.2",
570 + "optionator": "^0.8.1",
571 + "source-map": "~0.6.1"
572 + }
573 + },
574 + "esprima": {
575 + "version": "4.0.1",
576 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
577 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
578 + },
579 + "estraverse": {
580 + "version": "4.3.0",
581 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
582 + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
583 + },
584 + "esutils": {
585 + "version": "2.0.3",
586 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
587 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
588 + },
383 "etag": { 589 "etag": {
384 "version": "1.8.1", 590 "version": "1.8.1",
385 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 591 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
...@@ -422,6 +628,31 @@ ...@@ -422,6 +628,31 @@
422 "vary": "~1.1.2" 628 "vary": "~1.1.2"
423 } 629 }
424 }, 630 },
631 + "extend": {
632 + "version": "3.0.2",
633 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
634 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
635 + },
636 + "extsprintf": {
637 + "version": "1.3.0",
638 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
639 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
640 + },
641 + "fast-deep-equal": {
642 + "version": "3.1.1",
643 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
644 + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
645 + },
646 + "fast-json-stable-stringify": {
647 + "version": "2.1.0",
648 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
649 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
650 + },
651 + "fast-levenshtein": {
652 + "version": "2.0.6",
653 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
654 + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
655 + },
425 "fill-range": { 656 "fill-range": {
426 "version": "7.0.1", 657 "version": "7.0.1",
427 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 658 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
...@@ -444,6 +675,39 @@ ...@@ -444,6 +675,39 @@
444 "unpipe": "~1.0.0" 675 "unpipe": "~1.0.0"
445 } 676 }
446 }, 677 },
678 + "follow-redirects": {
679 + "version": "1.5.10",
680 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
681 + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
682 + "requires": {
683 + "debug": "=3.1.0"
684 + },
685 + "dependencies": {
686 + "debug": {
687 + "version": "3.1.0",
688 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
689 + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
690 + "requires": {
691 + "ms": "2.0.0"
692 + }
693 + }
694 + }
695 + },
696 + "forever-agent": {
697 + "version": "0.6.1",
698 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
699 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
700 + },
701 + "form-data": {
702 + "version": "2.3.3",
703 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
704 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
705 + "requires": {
706 + "asynckit": "^0.4.0",
707 + "combined-stream": "^1.0.6",
708 + "mime-types": "^2.1.12"
709 + }
710 + },
447 "forwarded": { 711 "forwarded": {
448 "version": "0.1.2", 712 "version": "0.1.2",
449 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 713 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
...@@ -468,6 +732,14 @@ ...@@ -468,6 +732,14 @@
468 "pump": "^3.0.0" 732 "pump": "^3.0.0"
469 } 733 }
470 }, 734 },
735 + "getpass": {
736 + "version": "0.1.7",
737 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
738 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
739 + "requires": {
740 + "assert-plus": "^1.0.0"
741 + }
742 + },
471 "glob-parent": { 743 "glob-parent": {
472 "version": "5.1.1", 744 "version": "5.1.1",
473 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 745 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
...@@ -507,6 +779,20 @@ ...@@ -507,6 +779,20 @@
507 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 779 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
508 "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 780 "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
509 }, 781 },
782 + "har-schema": {
783 + "version": "2.0.0",
784 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
785 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
786 + },
787 + "har-validator": {
788 + "version": "5.1.3",
789 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
790 + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
791 + "requires": {
792 + "ajv": "^6.5.5",
793 + "har-schema": "^2.0.0"
794 + }
795 + },
510 "has-flag": { 796 "has-flag": {
511 "version": "3.0.0", 797 "version": "3.0.0",
512 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 798 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
...@@ -517,6 +803,14 @@ ...@@ -517,6 +803,14 @@
517 "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", 803 "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
518 "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" 804 "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
519 }, 805 },
806 + "html-encoding-sniffer": {
807 + "version": "2.0.1",
808 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
809 + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
810 + "requires": {
811 + "whatwg-encoding": "^1.0.5"
812 + }
813 + },
520 "http": { 814 "http": {
521 "version": "0.0.1-security", 815 "version": "0.0.1-security",
522 "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", 816 "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
...@@ -546,6 +840,16 @@ ...@@ -546,6 +840,16 @@
546 } 840 }
547 } 841 }
548 }, 842 },
843 + "http-signature": {
844 + "version": "1.2.0",
845 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
846 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
847 + "requires": {
848 + "assert-plus": "^1.0.0",
849 + "jsprim": "^1.2.2",
850 + "sshpk": "^1.7.0"
851 + }
852 + },
549 "iconv-lite": { 853 "iconv-lite": {
550 "version": "0.4.24", 854 "version": "0.4.24",
551 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 855 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
...@@ -574,6 +878,11 @@ ...@@ -574,6 +878,11 @@
574 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 878 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
575 "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 879 "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
576 }, 880 },
881 + "ip-regex": {
882 + "version": "2.1.0",
883 + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
884 + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
885 + },
577 "ipaddr.js": { 886 "ipaddr.js": {
578 "version": "1.9.1", 887 "version": "1.9.1",
579 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 888 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
...@@ -642,6 +951,11 @@ ...@@ -642,6 +951,11 @@
642 "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", 951 "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
643 "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" 952 "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg=="
644 }, 953 },
954 + "is-potential-custom-element-name": {
955 + "version": "1.0.0",
956 + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
957 + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c="
958 + },
645 "is-typedarray": { 959 "is-typedarray": {
646 "version": "1.0.0", 960 "version": "1.0.0",
647 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 961 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
...@@ -652,11 +966,85 @@ ...@@ -652,11 +966,85 @@
652 "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 966 "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
653 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" 967 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
654 }, 968 },
969 + "isstream": {
970 + "version": "0.1.2",
971 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
972 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
973 + },
974 + "jquery": {
975 + "version": "3.5.1",
976 + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz",
977 + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg=="
978 + },
979 + "jsbn": {
980 + "version": "0.1.1",
981 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
982 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
983 + },
984 + "jsdom": {
985 + "version": "16.2.2",
986 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz",
987 + "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==",
988 + "requires": {
989 + "abab": "^2.0.3",
990 + "acorn": "^7.1.1",
991 + "acorn-globals": "^6.0.0",
992 + "cssom": "^0.4.4",
993 + "cssstyle": "^2.2.0",
994 + "data-urls": "^2.0.0",
995 + "decimal.js": "^10.2.0",
996 + "domexception": "^2.0.1",
997 + "escodegen": "^1.14.1",
998 + "html-encoding-sniffer": "^2.0.1",
999 + "is-potential-custom-element-name": "^1.0.0",
1000 + "nwsapi": "^2.2.0",
1001 + "parse5": "5.1.1",
1002 + "request": "^2.88.2",
1003 + "request-promise-native": "^1.0.8",
1004 + "saxes": "^5.0.0",
1005 + "symbol-tree": "^3.2.4",
1006 + "tough-cookie": "^3.0.1",
1007 + "w3c-hr-time": "^1.0.2",
1008 + "w3c-xmlserializer": "^2.0.0",
1009 + "webidl-conversions": "^6.0.0",
1010 + "whatwg-encoding": "^1.0.5",
1011 + "whatwg-mimetype": "^2.3.0",
1012 + "whatwg-url": "^8.0.0",
1013 + "ws": "^7.2.3",
1014 + "xml-name-validator": "^3.0.0"
1015 + }
1016 + },
655 "json-buffer": { 1017 "json-buffer": {
656 "version": "3.0.0", 1018 "version": "3.0.0",
657 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 1019 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
658 "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 1020 "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
659 }, 1021 },
1022 + "json-schema": {
1023 + "version": "0.2.3",
1024 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1025 + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
1026 + },
1027 + "json-schema-traverse": {
1028 + "version": "0.4.1",
1029 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1030 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
1031 + },
1032 + "json-stringify-safe": {
1033 + "version": "5.0.1",
1034 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1035 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
1036 + },
1037 + "jsprim": {
1038 + "version": "1.4.1",
1039 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1040 + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1041 + "requires": {
1042 + "assert-plus": "1.0.0",
1043 + "extsprintf": "1.3.0",
1044 + "json-schema": "0.2.3",
1045 + "verror": "1.10.0"
1046 + }
1047 + },
660 "keyv": { 1048 "keyv": {
661 "version": "3.1.0", 1049 "version": "3.1.0",
662 "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 1050 "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
...@@ -673,6 +1061,25 @@ ...@@ -673,6 +1061,25 @@
673 "package-json": "^6.3.0" 1061 "package-json": "^6.3.0"
674 } 1062 }
675 }, 1063 },
1064 + "levn": {
1065 + "version": "0.3.0",
1066 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1067 + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1068 + "requires": {
1069 + "prelude-ls": "~1.1.2",
1070 + "type-check": "~0.3.2"
1071 + }
1072 + },
1073 + "lodash": {
1074 + "version": "4.17.15",
1075 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1076 + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
1077 + },
1078 + "lodash.sortby": {
1079 + "version": "4.7.0",
1080 + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
1081 + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
1082 + },
676 "lowercase-keys": { 1083 "lowercase-keys": {
677 "version": "1.0.1", 1084 "version": "1.0.1",
678 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1085 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
...@@ -804,6 +1211,16 @@ ...@@ -804,6 +1211,16 @@
804 "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", 1211 "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
805 "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" 1212 "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
806 }, 1213 },
1214 + "nwsapi": {
1215 + "version": "2.2.0",
1216 + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
1217 + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
1218 + },
1219 + "oauth-sign": {
1220 + "version": "0.9.0",
1221 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1222 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1223 + },
807 "on-finished": { 1224 "on-finished": {
808 "version": "2.3.0", 1225 "version": "2.3.0",
809 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1226 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
...@@ -820,6 +1237,19 @@ ...@@ -820,6 +1237,19 @@
820 "wrappy": "1" 1237 "wrappy": "1"
821 } 1238 }
822 }, 1239 },
1240 + "optionator": {
1241 + "version": "0.8.3",
1242 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
1243 + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
1244 + "requires": {
1245 + "deep-is": "~0.1.3",
1246 + "fast-levenshtein": "~2.0.6",
1247 + "levn": "~0.3.0",
1248 + "prelude-ls": "~1.1.2",
1249 + "type-check": "~0.3.2",
1250 + "word-wrap": "~1.2.3"
1251 + }
1252 + },
823 "p-cancelable": { 1253 "p-cancelable": {
824 "version": "1.1.0", 1254 "version": "1.1.0",
825 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 1255 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
...@@ -843,6 +1273,11 @@ ...@@ -843,6 +1273,11 @@
843 } 1273 }
844 } 1274 }
845 }, 1275 },
1276 + "parse5": {
1277 + "version": "5.1.1",
1278 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
1279 + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
1280 + },
846 "parseurl": { 1281 "parseurl": {
847 "version": "1.3.3", 1282 "version": "1.3.3",
848 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1283 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
...@@ -853,11 +1288,21 @@ ...@@ -853,11 +1288,21 @@
853 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1288 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
854 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1289 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
855 }, 1290 },
1291 + "performance-now": {
1292 + "version": "2.1.0",
1293 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1294 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1295 + },
856 "picomatch": { 1296 "picomatch": {
857 "version": "2.2.2", 1297 "version": "2.2.2",
858 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1298 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
859 "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 1299 "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
860 }, 1300 },
1301 + "prelude-ls": {
1302 + "version": "1.1.2",
1303 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1304 + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
1305 + },
861 "prepend-http": { 1306 "prepend-http": {
862 "version": "2.0.0", 1307 "version": "2.0.0",
863 "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1308 "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
...@@ -872,6 +1317,11 @@ ...@@ -872,6 +1317,11 @@
872 "ipaddr.js": "1.9.1" 1317 "ipaddr.js": "1.9.1"
873 } 1318 }
874 }, 1319 },
1320 + "psl": {
1321 + "version": "1.8.0",
1322 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1323 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1324 + },
875 "pstree.remy": { 1325 "pstree.remy": {
876 "version": "1.1.8", 1326 "version": "1.1.8",
877 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1327 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
...@@ -886,6 +1336,11 @@ ...@@ -886,6 +1336,11 @@
886 "once": "^1.3.1" 1336 "once": "^1.3.1"
887 } 1337 }
888 }, 1338 },
1339 + "punycode": {
1340 + "version": "2.1.1",
1341 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1342 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1343 + },
889 "pupa": { 1344 "pupa": {
890 "version": "2.0.1", 1345 "version": "2.0.1",
891 "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", 1346 "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
...@@ -950,6 +1405,78 @@ ...@@ -950,6 +1405,78 @@
950 "rc": "^1.2.8" 1405 "rc": "^1.2.8"
951 } 1406 }
952 }, 1407 },
1408 + "request": {
1409 + "version": "2.88.2",
1410 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1411 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1412 + "requires": {
1413 + "aws-sign2": "~0.7.0",
1414 + "aws4": "^1.8.0",
1415 + "caseless": "~0.12.0",
1416 + "combined-stream": "~1.0.6",
1417 + "extend": "~3.0.2",
1418 + "forever-agent": "~0.6.1",
1419 + "form-data": "~2.3.2",
1420 + "har-validator": "~5.1.3",
1421 + "http-signature": "~1.2.0",
1422 + "is-typedarray": "~1.0.0",
1423 + "isstream": "~0.1.2",
1424 + "json-stringify-safe": "~5.0.1",
1425 + "mime-types": "~2.1.19",
1426 + "oauth-sign": "~0.9.0",
1427 + "performance-now": "^2.1.0",
1428 + "qs": "~6.5.2",
1429 + "safe-buffer": "^5.1.2",
1430 + "tough-cookie": "~2.5.0",
1431 + "tunnel-agent": "^0.6.0",
1432 + "uuid": "^3.3.2"
1433 + },
1434 + "dependencies": {
1435 + "qs": {
1436 + "version": "6.5.2",
1437 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1438 + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
1439 + },
1440 + "tough-cookie": {
1441 + "version": "2.5.0",
1442 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1443 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1444 + "requires": {
1445 + "psl": "^1.1.28",
1446 + "punycode": "^2.1.1"
1447 + }
1448 + }
1449 + }
1450 + },
1451 + "request-promise-core": {
1452 + "version": "1.1.3",
1453 + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
1454 + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
1455 + "requires": {
1456 + "lodash": "^4.17.15"
1457 + }
1458 + },
1459 + "request-promise-native": {
1460 + "version": "1.0.8",
1461 + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
1462 + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
1463 + "requires": {
1464 + "request-promise-core": "1.1.3",
1465 + "stealthy-require": "^1.1.1",
1466 + "tough-cookie": "^2.3.3"
1467 + },
1468 + "dependencies": {
1469 + "tough-cookie": {
1470 + "version": "2.5.0",
1471 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1472 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1473 + "requires": {
1474 + "psl": "^1.1.28",
1475 + "punycode": "^2.1.1"
1476 + }
1477 + }
1478 + }
1479 + },
953 "responselike": { 1480 "responselike": {
954 "version": "1.0.2", 1481 "version": "1.0.2",
955 "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1482 "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
...@@ -968,6 +1495,14 @@ ...@@ -968,6 +1495,14 @@
968 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1495 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
969 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1496 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
970 }, 1497 },
1498 + "saxes": {
1499 + "version": "5.0.1",
1500 + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
1501 + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
1502 + "requires": {
1503 + "xmlchars": "^2.2.0"
1504 + }
1505 + },
971 "semver": { 1506 "semver": {
972 "version": "5.7.1", 1507 "version": "5.7.1",
973 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1508 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
...@@ -1036,11 +1571,38 @@ ...@@ -1036,11 +1571,38 @@
1036 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1571 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1037 "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1572 "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
1038 }, 1573 },
1574 + "source-map": {
1575 + "version": "0.6.1",
1576 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1577 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1578 + "optional": true
1579 + },
1580 + "sshpk": {
1581 + "version": "1.16.1",
1582 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1583 + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1584 + "requires": {
1585 + "asn1": "~0.2.3",
1586 + "assert-plus": "^1.0.0",
1587 + "bcrypt-pbkdf": "^1.0.0",
1588 + "dashdash": "^1.12.0",
1589 + "ecc-jsbn": "~0.1.1",
1590 + "getpass": "^0.1.1",
1591 + "jsbn": "~0.1.0",
1592 + "safer-buffer": "^2.0.2",
1593 + "tweetnacl": "~0.14.0"
1594 + }
1595 + },
1039 "statuses": { 1596 "statuses": {
1040 "version": "1.5.0", 1597 "version": "1.5.0",
1041 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1598 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1042 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1599 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1043 }, 1600 },
1601 + "stealthy-require": {
1602 + "version": "1.1.1",
1603 + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
1604 + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
1605 + },
1044 "string-width": { 1606 "string-width": {
1045 "version": "4.2.0", 1607 "version": "4.2.0",
1046 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1608 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
...@@ -1097,6 +1659,11 @@ ...@@ -1097,6 +1659,11 @@
1097 "has-flag": "^3.0.0" 1659 "has-flag": "^3.0.0"
1098 } 1660 }
1099 }, 1661 },
1662 + "symbol-tree": {
1663 + "version": "3.2.4",
1664 + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
1665 + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
1666 + },
1100 "term-size": { 1667 "term-size": {
1101 "version": "2.2.0", 1668 "version": "2.2.0",
1102 "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", 1669 "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
...@@ -1128,6 +1695,45 @@ ...@@ -1128,6 +1695,45 @@
1128 "nopt": "~1.0.10" 1695 "nopt": "~1.0.10"
1129 } 1696 }
1130 }, 1697 },
1698 + "tough-cookie": {
1699 + "version": "3.0.1",
1700 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
1701 + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
1702 + "requires": {
1703 + "ip-regex": "^2.1.0",
1704 + "psl": "^1.1.28",
1705 + "punycode": "^2.1.1"
1706 + }
1707 + },
1708 + "tr46": {
1709 + "version": "2.0.2",
1710 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
1711 + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
1712 + "requires": {
1713 + "punycode": "^2.1.1"
1714 + }
1715 + },
1716 + "tunnel-agent": {
1717 + "version": "0.6.0",
1718 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1719 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1720 + "requires": {
1721 + "safe-buffer": "^5.0.1"
1722 + }
1723 + },
1724 + "tweetnacl": {
1725 + "version": "0.14.5",
1726 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1727 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1728 + },
1729 + "type-check": {
1730 + "version": "0.3.2",
1731 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1732 + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1733 + "requires": {
1734 + "prelude-ls": "~1.1.2"
1735 + }
1736 + },
1131 "type-fest": { 1737 "type-fest": {
1132 "version": "0.8.1", 1738 "version": "0.8.1",
1133 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1739 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
...@@ -1191,6 +1797,14 @@ ...@@ -1191,6 +1797,14 @@
1191 "xdg-basedir": "^4.0.0" 1797 "xdg-basedir": "^4.0.0"
1192 } 1798 }
1193 }, 1799 },
1800 + "uri-js": {
1801 + "version": "4.2.2",
1802 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1803 + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1804 + "requires": {
1805 + "punycode": "^2.1.0"
1806 + }
1807 + },
1194 "url-parse-lax": { 1808 "url-parse-lax": {
1195 "version": "3.0.0", 1809 "version": "3.0.0",
1196 "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1810 "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
...@@ -1204,11 +1818,77 @@ ...@@ -1204,11 +1818,77 @@
1204 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1818 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1205 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1819 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1206 }, 1820 },
1821 + "uuid": {
1822 + "version": "3.4.0",
1823 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1824 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1825 + },
1207 "vary": { 1826 "vary": {
1208 "version": "1.1.2", 1827 "version": "1.1.2",
1209 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1828 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1210 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1829 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1211 }, 1830 },
1831 + "verror": {
1832 + "version": "1.10.0",
1833 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1834 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1835 + "requires": {
1836 + "assert-plus": "^1.0.0",
1837 + "core-util-is": "1.0.2",
1838 + "extsprintf": "^1.2.0"
1839 + }
1840 + },
1841 + "w3c-hr-time": {
1842 + "version": "1.0.2",
1843 + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
1844 + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
1845 + "requires": {
1846 + "browser-process-hrtime": "^1.0.0"
1847 + }
1848 + },
1849 + "w3c-xmlserializer": {
1850 + "version": "2.0.0",
1851 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
1852 + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
1853 + "requires": {
1854 + "xml-name-validator": "^3.0.0"
1855 + }
1856 + },
1857 + "webidl-conversions": {
1858 + "version": "6.1.0",
1859 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
1860 + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
1861 + },
1862 + "whatwg-encoding": {
1863 + "version": "1.0.5",
1864 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
1865 + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
1866 + "requires": {
1867 + "iconv-lite": "0.4.24"
1868 + }
1869 + },
1870 + "whatwg-mimetype": {
1871 + "version": "2.3.0",
1872 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
1873 + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
1874 + },
1875 + "whatwg-url": {
1876 + "version": "8.1.0",
1877 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz",
1878 + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==",
1879 + "requires": {
1880 + "lodash.sortby": "^4.7.0",
1881 + "tr46": "^2.0.2",
1882 + "webidl-conversions": "^5.0.0"
1883 + },
1884 + "dependencies": {
1885 + "webidl-conversions": {
1886 + "version": "5.0.0",
1887 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
1888 + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
1889 + }
1890 + }
1891 + },
1212 "widest-line": { 1892 "widest-line": {
1213 "version": "3.1.0", 1893 "version": "3.1.0",
1214 "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", 1894 "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
...@@ -1217,6 +1897,11 @@ ...@@ -1217,6 +1897,11 @@
1217 "string-width": "^4.0.0" 1897 "string-width": "^4.0.0"
1218 } 1898 }
1219 }, 1899 },
1900 + "word-wrap": {
1901 + "version": "1.2.3",
1902 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
1903 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
1904 + },
1220 "wrappy": { 1905 "wrappy": {
1221 "version": "1.0.2", 1906 "version": "1.0.2",
1222 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1907 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
...@@ -1233,10 +1918,25 @@ ...@@ -1233,10 +1918,25 @@
1233 "typedarray-to-buffer": "^3.1.5" 1918 "typedarray-to-buffer": "^3.1.5"
1234 } 1919 }
1235 }, 1920 },
1921 + "ws": {
1922 + "version": "7.3.0",
1923 + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
1924 + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w=="
1925 + },
1236 "xdg-basedir": { 1926 "xdg-basedir": {
1237 "version": "4.0.0", 1927 "version": "4.0.0",
1238 "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1928 "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
1239 "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 1929 "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
1930 + },
1931 + "xml-name-validator": {
1932 + "version": "3.0.0",
1933 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
1934 + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
1935 + },
1936 + "xmlchars": {
1937 + "version": "2.2.0",
1938 + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
1939 + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
1240 } 1940 }
1241 } 1941 }
1242 } 1942 }
......
...@@ -9,8 +9,11 @@ ...@@ -9,8 +9,11 @@
9 "author": "", 9 "author": "",
10 "license": "ISC", 10 "license": "ISC",
11 "dependencies": { 11 "dependencies": {
12 + "axios": "^0.19.2",
12 "express": "^4.17.1", 13 "express": "^4.17.1",
13 "http": "0.0.1-security", 14 "http": "0.0.1-security",
15 + "jquery": "^3.5.1",
16 + "jsdom": "^16.2.2",
14 "nodemon": "^2.0.4" 17 "nodemon": "^2.0.4"
15 } 18 }
16 } 19 }
......
1 +axios = require('axios');
2 +
3 +const crwalCharacterCode = async function(nickname) {
4 + try {
5 + const resp = await axios.get("https://maplestory.nexon.com/Ranking/World/Total?c=" + encodeURI(nickname));
6 +
7 + const regex = new RegExp(`<dt><a href=\\"\\/Common\\/Character\\/Detail\\/[^\\?]+?\\?p=(.+?)\\"\\s+target=.+?\\/>${nickname}<\\/a><\\/dt>`);
8 + const regexResult = regex.exec(resp.data);
9 +
10 + if (!regexResult)
11 + return -2;
12 +
13 + return regexResult[1];
14 + } catch (error) {
15 + console.log(error);
16 + return -1;
17 + }
18 +}
19 +
20 +const getCharacterInfo = async function(nickname, characterCode) {
21 + try {
22 + const resp = await axios.get("https://maplestory.nexon.com/Common/Character/Detail/" + encodeURI(nickname) + "?p=" + characterCode);
23 +
24 + if (resp.data.indexOf("공개하지 않은 정보입니다.") >= 0) {
25 + throw new Error("private_character");
26 + }
27 +
28 + if (resp.data.indexOf("메이플스토리 게임 점검 중에는 이용하실 수 없습니다.") >= 0) {
29 + throw new Error("game_checking");
30 + }
31 +
32 + const character = {
33 + nickname: nickname,
34 + characterCode: characterCode,
35 + job: null,
36 + level: null,
37 + avatar: null,
38 + server: {
39 + icon: null,
40 + name: null
41 + },
42 + majorName: null,
43 + attackPowerName: null
44 + };
45 + const stats = {
46 + major: 0,
47 + minor: 0,
48 + majorHyper: 0,
49 + damageHyper: 0,
50 + criticalDamage: 0,
51 + bossAttackDamage: 0,
52 + ignoreGuard: 0,
53 + statAttackPower: 0
54 + };
55 +
56 + const { JSDOM } = require('jsdom');
57 + const dom = new JSDOM(resp.data);
58 + const $ = (require('jquery'))(dom.window);
59 +
60 + const jobModel = require('../model/job');
61 + const statModel = require('../model/stat');
62 +
63 + character.job = $(".tab01_con_wrap .table_style01:eq(0) tbody tr:eq(0) td:eq(1) span").text();
64 + character.level = parseInt($(".char_info dl:eq(0) dd").text().substring(3));
65 + character.avatar = $(".char_img img").attr("src");
66 + character.server = {
67 + name: $(".char_info dl:eq(2) dd").text(),
68 + icon: $(".char_info dl:eq(2) dd img").attr("src")
69 + };
70 + character.majorName = jobModel[character.job].major;
71 + character.attackPowerName = character.majorName == "INT" ? "마력" : "공격력";
72 +
73 + const $statInfo = $(".tab01_con_wrap .table_style01:eq(1)");
74 + $("tbody tr", $statInfo).each(function() {
75 + if ($("th", this).length == 1) {
76 + if ($("th span", this).text() == "하이퍼스탯") {
77 + const values = $("td span", this).html().split("<br>");
78 +
79 + const regexMajor = new RegExp(`${statModel[character.majorName].korean} (\\d+) 증가`);
80 + const regexDamage = new RegExp(`^데미지 (\\d+)% 증가`);
81 +
82 + let regexResult;
83 + for (let i = 0; i < values.length; i++) {
84 + if (regexResult = regexMajor.exec(values[i]))
85 + stats['majorHyper'] = parseInt(regexResult[1]);
86 + else if (regexResult = regexDamage.exec(values[i]))
87 + stats['damageHyper'] = parseInt(regexResult[1]);
88 + }
89 + }
90 + } else {
91 + for (let i = 0; i < 2; i++) {
92 + const statName = $(`th:eq(${i}) span`, this).text();
93 + const value = $(`td:eq(${i}) span`, this).text().replace(/\,/g, "");
94 +
95 + switch (statName) {
96 + case character.majorName:
97 + stats['major'] = parseInt(value);
98 + break;
99 + case jobModel[character.job].minor:
100 + stats['minor'] = parseInt(value);
101 + break;
102 + case "크리티컬 데미지":
103 + stats['criticalDamage'] = parseInt(value);
104 + break;
105 + case "보스공격력":
106 + stats['bossAttackDamage'] = parseInt(value);
107 + break;
108 + case "방어율무시":
109 + stats['ignoreGuard'] = parseInt(value);
110 + break;
111 + case "스탯공격력":
112 + stats['statAttackPower'] = parseInt(value.split(' ~ ')[1]);
113 + }
114 + }
115 + }
116 + });
117 +
118 + return {
119 + character: character,
120 + stats: stats
121 + };
122 + } catch (error) {
123 + console.log(error);
124 + if (error.message == "private_character")
125 + return -1;
126 + else if (error.message == "game_checking")
127 + return -2;
128 + else
129 + return -999;
130 + }
131 +}
132 +
133 +const analyzeEquipment = async function(nickname, characterCode, job) {
134 + try {
135 + const resp = await axios.get("https://maplestory.nexon.com/Common/Character/Detail/" + encodeURI(nickname) + "/Equipment?p=" + characterCode);
136 +
137 + if (resp.data.indexOf("공개하지 않은 정보입니다.") >= 0) {
138 + throw new Error("private_character");
139 + }
140 +
141 + if (resp.data.indexOf("메이플스토리 게임 점검 중에는 이용하실 수 없습니다.") >= 0) {
142 + throw new Error("game_checking");
143 + }
144 +
145 + const { JSDOM } = require('jsdom');
146 + const dom = new JSDOM(resp.data);
147 + const $ = (require('jquery'))(dom.window);
148 +
149 + // 아케인심볼 분석
150 + let majorArcane = 0;
151 + const arcaneURLs = [];
152 + $(".tab03_con_wrap .arcane_weapon_wrap .item_pot li span a").each(async function() {
153 + if (!!$(this).attr("href"))
154 + arcaneURLs.push("https://maplestory.nexon.com" + $(this).attr("href"));
155 + });
156 +
157 + for (let i = 0; i < arcaneURLs.length; i++) {
158 + const equipmentResp = await axios.get(arcaneURLs[i], {
159 + headers: {
160 + 'X-Requested-With': 'XMLHttpRequest'
161 + }
162 + });
163 +
164 + const equipmentDom = new JSDOM(equipmentResp.data.view);
165 + const $equipment = (require('jquery'))(equipmentDom.window);
166 +
167 + majorArcane += parseInt($equipment(".stet_info ul li:eq(2) .point_td font:eq(0)").text().substring(1));
168 + }
169 +
170 + // 장비 분석
171 + const jobModel = require('../model/job');
172 +
173 + let damagePercent = 0;
174 + let majorPercent = 0;
175 + let attackPowerPercent = 0;
176 + let weapon = undefined;
177 + const equipmentURLs = [];
178 + $(".tab01_con_wrap .weapon_wrap .item_pot li span a").each(async function() {
179 + equipmentURLs.push("https://maplestory.nexon.com" + $(this).attr("href"));
180 + });
181 +
182 + for (let i = 0; i < equipmentURLs.length; i++) {
183 + const equipmentResp = await axios.get(equipmentURLs[i], {
184 + headers: {
185 + 'X-Requested-With': 'XMLHttpRequest'
186 + }
187 + });
188 +
189 + const equipmentDom = new JSDOM(equipmentResp.data.view);
190 + const $equipment = (require('jquery'))(equipmentDom.window);
191 +
192 + const equipmentType = $equipment(".item_ability .ablilty02:eq(1) .job_name em").text();
193 + if (equipmentType.indexOf("손무기") >= 0 && equipmentType.indexOf("블레이드") < 0 && equipmentType.indexOf("대검") < 0) {
194 + weapon = equipmentType.split(" (")[0];
195 + }
196 +
197 + $equipment(".stet_info ul li").each(function() {
198 + const regexMajor1 = new RegExp(`${jobModel[job].major} : \\+(\\d+)%`);
199 + const regexMajor2 = new RegExp(`올스탯 : \\+(\\d+)%`);
200 + const regexAttackPower = (jobModel[job].major == "INT") ?
201 + new RegExp(`마력 : \\+(\\d+)%`) :
202 + new RegExp(`공격력 : \\+(\\d+)%`);
203 + const regexDamage = new RegExp(`^데미지 : \\+(\\d+)%`);
204 +
205 + if ($(this).find(".stet_th span").text() == "올스탯") {
206 + majorPercent += parseInt($(this).find(".point_td font:eq(0)").text().substring(1));
207 + } else if ($(this).find(".stet_th span").text().indexOf("잠재옵션") >= 0) {
208 + const values = $(this).find(".point_td").html().split("<br>");
209 + for (let j = 0; j < values.length; j++) {
210 + const value = values[j].trim();
211 + let regexResult;
212 +
213 + if (regexResult = (regexMajor1.exec(value) || regexMajor2.exec(value))) {
214 + majorPercent += parseInt(regexResult[1]);
215 + } else if (regexResult = regexAttackPower.exec(value)) {
216 + attackPowerPercent += parseInt(regexResult[1]);
217 + } else if (regexResult = regexDamage.exec(value)) {
218 + damagePercent += parseInt(regexResult[1]);
219 + }
220 + }
221 + }
222 + })
223 + }
224 +
225 + return {
226 + majorArcane: majorArcane,
227 + majorPercent: majorPercent,
228 + attackPowerPercent: attackPowerPercent,
229 + damagePercent: damagePercent,
230 + weapon: weapon
231 + };
232 + } catch (error) {
233 + console.log(error);
234 + if (error.message == "private_character")
235 + return -1;
236 + else if (error.message == "game_checking")
237 + return -2;
238 + else
239 + return -999;
240 + }
241 +}
242 +
243 +const analyzeStats = function(characterInfo, analysisEquipment) {
244 + const jobModel = require('../model/job');
245 + const job = jobModel[characterInfo.character.job];
246 + const jobDefault = jobModel.default;
247 + const weaponConst = require('../model/weapon')[analysisEquipment.weapon] || 1;
248 + const stats = {
249 + major: {
250 + pure: 0,
251 + percent: analysisEquipment.majorPercent +
252 + job.stats.passive.major.percent +
253 + jobDefault.stats.passive.major.percent,
254 + added: 0
255 + },
256 + minor: characterInfo.stats.minor,
257 + damage: {
258 + all: characterInfo.stats.damageHyper +
259 + analysisEquipment.damagePercent +
260 + job.stats.passive.damage.all +
261 + jobDefault.stats.passive.damage.all,
262 + boss: characterInfo.stats.bossAttackDamage
263 + },
264 + finalDamage: job.stats.passive.finalDamage,
265 + criticalDamage: characterInfo.stats.criticalDamage + jobDefault.stats.passive.criticalDamage,
266 + attackPower: {
267 + pure: 0,
268 + percent: analysisEquipment.attackPowerPercent +
269 + job.stats.passive.attackPower.percent
270 + },
271 + ignoreGuard: characterInfo.stats.ignoreGuard
272 + };
273 +
274 + stats.major.added = characterInfo.stats.majorHyper +
275 + analysisEquipment.majorArcane +
276 + jobDefault.stats.passive.major.added;
277 + stats.major.pure = (characterInfo.stats.major - stats.major.added) / (1 + stats.major.percent / 100);
278 +
279 + stats.attackPower.pure = characterInfo.stats.statAttackPower * 100 / (characterInfo.stats.major * 4 + stats.minor) / job.jobConst / weaponConst / (1 + stats.attackPower.percent / 100) / (1 + stats.damage.all / 100) / (1 + stats.finalDamage / 100);
280 +
281 + return stats;
282 +}
283 +
284 +const calculateEfficiency = function(stats, job, weapon) {
285 + const efficiency = {
286 + major: {
287 + pure: 1,
288 + percent: 0
289 + },
290 + attackPower: {
291 + pure: 0,
292 + percent: 0,
293 + },
294 + damage: 0,
295 + criticalDamage: 0,
296 + ignoreGuard: 0
297 + };
298 +
299 + const defaultPower = calculatePower(stats, job, weapon);
300 +
301 + stats.major.pure += 1;
302 + const majorPure = calculatePower(stats, job, weapon) - defaultPower;
303 + stats.major.pure -= 1;
304 +
305 + if (majorPure == 0)
306 + return efficiency;
307 +
308 + stats.major.percent += 1;
309 + efficiency.major.percent = (calculatePower(stats, job, weapon) - defaultPower) / majorPure;
310 + stats.major.percent -= 1;
311 +
312 + stats.attackPower.pure += 1;
313 + efficiency.attackPower.pure = (calculatePower(stats, job, weapon) - defaultPower) / majorPure;
314 + stats.attackPower.pure -= 1;
315 +
316 + stats.attackPower.percent += 1;
317 + efficiency.attackPower.percent = (calculatePower(stats, job, weapon) - defaultPower) / majorPure;
318 + stats.attackPower.percent -= 1;
319 +
320 + stats.damage.all += 1;
321 + efficiency.damage = (calculatePower(stats, job, weapon) - defaultPower) / majorPure;
322 + stats.damage.all -= 1;
323 +
324 + stats.criticalDamage += 1;
325 + efficiency.criticalDamage = (calculatePower(stats, job, weapon) - defaultPower) / majorPure;
326 + stats.criticalDamage -= 1;
327 +
328 + // 곱연산
329 + const ignoreGuardSaved = stats.ignoreGuard;
330 + stats.ignoreGuard = (1 - (1 - stats.ignoreGuard / 100) * 0.99) * 100;
331 + efficiency.ignoreGuard = (calculatePower(stats, job, weapon) - defaultPower) / majorPure;
332 + stats.ignoreGuard = ignoreGuardSaved;
333 +
334 + return efficiency;
335 +}
336 +
337 +// 버프 적용 스탯 구하기
338 +const getBuffStats = function(stats, job) {
339 + const jobModel = require('../model/job');
340 + const buff = jobModel[job].stats.active;
341 + const defaultBuff = jobModel.default.stats.active;
342 +
343 + return {
344 + major: {
345 + pure: stats.major.pure + buff.major.pure,
346 + percent: stats.major.percent + buff.major.percent,
347 + added: stats.major.added
348 + },
349 + minor: stats.minor,
350 + damage: {
351 + all: stats.damage.all + buff.damage.all + defaultBuff.damage.all,
352 + boss: stats.damage.boss + buff.damage.boss + defaultBuff.damage.boss
353 + },
354 + finalDamage: stats.finalDamage,
355 + criticalDamage: stats.criticalDamage + buff.criticalDamage + defaultBuff.criticalDamage,
356 + attackPower: {
357 + pure: stats.attackPower.pure + buff.attackPower.pure,
358 + percent: stats.attackPower.percent + buff.attackPower.percent + defaultBuff.attackPower.percent
359 + },
360 + ignoreGuard: (1 - (1 - (stats.ignoreGuard / 100)) * (1 - (buff.ignoreGuard / 100)) * (1 - (defaultBuff.ignoreGuard / 100))) * 100
361 + };
362 +}
363 +
364 +// 크리티컬 데미지, 보스 공격력, 방어율 무시를 반영하여 방어율 300% 몬스터 공격시 데미지 산출 값
365 +const calculatePower = function(stats, job, weapon) {
366 + const jobConst = require('../model/job')[job].jobConst;
367 + const weaponConst = require('../model/weapon')[weapon];
368 + return Math.max(
369 + (
370 + (stats.major.pure * (1 + stats.major.percent / 100) + stats.major.added) * 4 +
371 + stats.minor
372 + ) *
373 + 0.01 *
374 + (stats.attackPower.pure * (1 + stats.attackPower.percent / 100)) *
375 + jobConst *
376 + weaponConst *
377 + (1 + stats.damage.all / 100 + stats.damage.boss / 100) *
378 + (1 + stats.finalDamage / 100) *
379 + (1.35 + stats.criticalDamage / 100) *
380 + (1 - 3 * (1 - stats.ignoreGuard / 100)),
381 + 1);
382 +}
383 +
384 +module.exports = {
385 + getCharacter: async function(req, res) {
386 + if (!req.query.nickname) {
387 + res.status(204).send();
388 + return;
389 + }
390 +
391 + const nickname = req.query.nickname;
392 + const characterCode = await crwalCharacterCode(req.query.nickname);
393 +
394 + if (characterCode == -1) {
395 + res.status(500).send();
396 + return;
397 + } else if (characterCode == -2) {
398 + res.status(404).send();
399 + return;
400 + }
401 +
402 + const characterInfo = await getCharacterInfo(nickname, characterCode);
403 + if (characterInfo == -1) {
404 + // 접근 권한 설정 필요
405 + res.status(403).send();
406 + return;
407 + } else if (characterInfo == -2) {
408 + // 점검중
409 + res.status(503).send();
410 + return;
411 + } else if (characterInfo < 0) {
412 + res.status(400).send();
413 + return;
414 + }
415 +
416 + const analysisEquipment = await analyzeEquipment(nickname, characterCode, characterInfo.character.job);
417 + if (analysisEquipment == -1) {
418 + // 접근 권한 설정 필요
419 + res.status(403).send();
420 + return;
421 + } else if (analysisEquipment == -2) {
422 + // 점검중
423 + res.status(503).send();
424 + return;
425 + } else if (analysisEquipment < 0) {
426 + res.status(400).send();
427 + return;
428 + }
429 +
430 + const stats = analyzeStats(characterInfo, analysisEquipment);
431 + const buffStats = getBuffStats(stats, characterInfo.character.job);
432 + const efficiency = calculateEfficiency(stats, characterInfo.character.job, analysisEquipment.weapon);
433 + const buffEfficiency = calculateEfficiency(buffStats, characterInfo.character.job, analysisEquipment.weapon);
434 +
435 + const result = {
436 + info: characterInfo.character,
437 + analysis: {
438 + default: {
439 + stats: stats,
440 + efficiency: efficiency
441 + },
442 + buff: {
443 + stats: buffStats,
444 + efficiency: buffEfficiency
445 + }
446 + }
447 + };
448 +
449 + console.log(JSON.stringify(result));
450 + res.send(result);
451 + }
452 +};
...\ No newline at end of file ...\ No newline at end of file
1 -module.exports = function(req, res) {
2 - res.send('this is home');
3 -}
...\ No newline at end of file ...\ No newline at end of file
1 let routes = {}; 1 let routes = {};
2 -routes.home = require('./home'); 2 +routes.character = require('./character');
3 3
4 module.exports = routes; 4 module.exports = routes;
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -30,6 +30,14 @@ ...@@ -30,6 +30,14 @@
30 "js-tokens": "^4.0.0" 30 "js-tokens": "^4.0.0"
31 } 31 }
32 }, 32 },
33 + "@lottiefiles/svelte-lottie-player": {
34 + "version": "0.1.4",
35 + "resolved": "https://registry.npmjs.org/@lottiefiles/svelte-lottie-player/-/svelte-lottie-player-0.1.4.tgz",
36 + "integrity": "sha512-NVNDdB1kQLIOytWsTxEYRRHhl2T9oZFfKSkUEr8m73JM7jaLP8J8GGH9B6A0vXU4wKsjR69ET6JEvib6z1QH+g==",
37 + "requires": {
38 + "lottie-web": "^5.6.8"
39 + }
40 + },
33 "@nodelib/fs.scandir": { 41 "@nodelib/fs.scandir": {
34 "version": "2.1.3", 42 "version": "2.1.3",
35 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", 43 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
...@@ -85,9 +93,9 @@ ...@@ -85,9 +93,9 @@
85 } 93 }
86 }, 94 },
87 "@rollup/pluginutils": { 95 "@rollup/pluginutils": {
88 - "version": "3.0.10", 96 + "version": "3.1.0",
89 - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz", 97 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
90 - "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==", 98 + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
91 "dev": true, 99 "dev": true,
92 "requires": { 100 "requires": {
93 "@types/estree": "0.0.39", 101 "@types/estree": "0.0.39",
...@@ -101,11 +109,6 @@ ...@@ -101,11 +109,6 @@
101 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 109 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
102 "dev": true 110 "dev": true
103 }, 111 },
104 - "@types/events": {
105 - "version": "3.0.0",
106 - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
107 - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
108 - },
109 "@types/fs-extra": { 112 "@types/fs-extra": {
110 "version": "8.1.1", 113 "version": "8.1.1",
111 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", 114 "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz",
...@@ -115,11 +118,10 @@ ...@@ -115,11 +118,10 @@
115 } 118 }
116 }, 119 },
117 "@types/glob": { 120 "@types/glob": {
118 - "version": "7.1.1", 121 + "version": "7.1.2",
119 - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", 122 + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz",
120 - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", 123 + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==",
121 "requires": { 124 "requires": {
122 - "@types/events": "*",
123 "@types/minimatch": "*", 125 "@types/minimatch": "*",
124 "@types/node": "*" 126 "@types/node": "*"
125 } 127 }
...@@ -130,9 +132,9 @@ ...@@ -130,9 +132,9 @@
130 "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" 132 "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
131 }, 133 },
132 "@types/node": { 134 "@types/node": {
133 - "version": "14.0.9", 135 + "version": "14.0.13",
134 - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.9.tgz", 136 + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz",
135 - "integrity": "sha512-0sCTiXKXELOBxvZLN4krQ0FPOAA7ij+6WwvD0k/PHd9/KAkr4dXel5J9fh6F4x1FwAQILqAWkmpeuS6mjf1iKA==" 137 + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA=="
136 }, 138 },
137 "@types/resolve": { 139 "@types/resolve": {
138 "version": "0.0.8", 140 "version": "0.0.8",
...@@ -144,9 +146,9 @@ ...@@ -144,9 +146,9 @@
144 } 146 }
145 }, 147 },
146 "acorn": { 148 "acorn": {
147 - "version": "7.2.0", 149 + "version": "7.3.1",
148 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", 150 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
149 - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", 151 + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
150 "dev": true 152 "dev": true
151 }, 153 },
152 "ansi-styles": { 154 "ansi-styles": {
...@@ -163,6 +165,14 @@ ...@@ -163,6 +165,14 @@
163 "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 165 "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
164 "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 166 "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
165 }, 167 },
168 + "axios": {
169 + "version": "0.19.2",
170 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
171 + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
172 + "requires": {
173 + "follow-redirects": "1.5.10"
174 + }
175 + },
166 "balanced-match": { 176 "balanced-match": {
167 "version": "1.0.0", 177 "version": "1.0.0",
168 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 178 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
...@@ -244,6 +254,14 @@ ...@@ -244,6 +254,14 @@
244 "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", 254 "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz",
245 "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==" 255 "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ=="
246 }, 256 },
257 + "debug": {
258 + "version": "3.1.0",
259 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
260 + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
261 + "requires": {
262 + "ms": "2.0.0"
263 + }
264 + },
247 "dir-glob": { 265 "dir-glob": {
248 "version": "3.0.1", 266 "version": "3.0.1",
249 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 267 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
...@@ -293,6 +311,14 @@ ...@@ -293,6 +311,14 @@
293 "to-regex-range": "^5.0.1" 311 "to-regex-range": "^5.0.1"
294 } 312 }
295 }, 313 },
314 + "follow-redirects": {
315 + "version": "1.5.10",
316 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
317 + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
318 + "requires": {
319 + "debug": "=3.1.0"
320 + }
321 + },
296 "fs-extra": { 322 "fs-extra": {
297 "version": "8.1.0", 323 "version": "8.1.0",
298 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 324 "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
...@@ -478,6 +504,11 @@ ...@@ -478,6 +504,11 @@
478 "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz", 504 "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz",
479 "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==" 505 "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA=="
480 }, 506 },
507 + "lottie-web": {
508 + "version": "5.6.10",
509 + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.6.10.tgz",
510 + "integrity": "sha512-ucTzaiBJOMm56/K7Wqjajyh7qXlonHKB3+b5fHvhSiz+jOrXt6QDNKAinI3qdw/zvvYHKzXvFMy5SgOXbOJ5ng=="
511 + },
481 "magic-string": { 512 "magic-string": {
482 "version": "0.25.7", 513 "version": "0.25.7",
483 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 514 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
...@@ -525,6 +556,11 @@ ...@@ -525,6 +556,11 @@
525 "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz", 556 "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz",
526 "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==" 557 "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg=="
527 }, 558 },
559 + "ms": {
560 + "version": "2.0.0",
561 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
562 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
563 + },
528 "once": { 564 "once": {
529 "version": "1.4.0", 565 "version": "1.4.0",
530 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 566 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
...@@ -722,9 +758,9 @@ ...@@ -722,9 +758,9 @@
722 } 758 }
723 }, 759 },
724 "svelte": { 760 "svelte": {
725 - "version": "3.23.0", 761 + "version": "3.23.2",
726 - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.23.0.tgz", 762 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.23.2.tgz",
727 - "integrity": "sha512-cnyd96bK/Nw5DnYuB1hzm5cl6+I1fpmdKOteA7KLzU9KGLsLmvWsSkSKbcntzODCLmSySN3HjcgTHRo6/rJNTw==", 763 + "integrity": "sha512-hE8GeTM83YVR4GY6/6PeDEcGct4JS5aCi+IYbCAa76oaPSfuF7L85DQYULQxlTK/KPWzw3L1GRGmC3oPG/PQoA==",
728 "dev": true 764 "dev": true
729 }, 765 },
730 "svelte-spa-router": { 766 "svelte-spa-router": {
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
15 "svelte": "^3.0.0" 15 "svelte": "^3.0.0"
16 }, 16 },
17 "dependencies": { 17 "dependencies": {
18 + "@lottiefiles/svelte-lottie-player": "^0.1.4",
19 + "axios": "^0.19.2",
18 "rollup-plugin-copy": "^3.3.0", 20 "rollup-plugin-copy": "^3.3.0",
19 "sirv-cli": "^0.4.4", 21 "sirv-cli": "^0.4.4",
20 "svelte-spa-router": "^2.1.0" 22 "svelte-spa-router": "^2.1.0"
......
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html lang="en"> 2 <html lang="en">
3 3
4 -<head> 4 +<head lang="ko">
5 <meta charset='utf-8'> 5 <meta charset='utf-8'>
6 <meta name='viewport' content='width=device-width,initial-scale=1'> 6 <meta name='viewport' content='width=device-width,initial-scale=1'>
7 7
8 <title>::메이플스토리 스펙 계산기::</title> 8 <title>::메이플스토리 스펙 계산기::</title>
9 9
10 - <link rel='icon' type='image/png' href='/favicon.png'> 10 + <link rel='icon' type='shortcut icon' href='./build/static/images/favicon.ico'>
11 - <link rel='stylesheet' href='/global.css'> 11 + <link rel='stylesheet' href='./static/css/global.css'>
12 <link rel='stylesheet' href='/build/bundle.css'> 12 <link rel='stylesheet' href='/build/bundle.css'>
13 + <meta property="og:image" content="./build/static/images/ogimage.png">
14 + <meta property="og:title" content="::메이플스토리 스펙 계산기::">
15 + <meta property="og:description" content="당신의 메이플스토리 스펙 효율을 빠르게 계산해보세요!">
13 16
14 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"> 17 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
15 <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script> 18 <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
......
...@@ -38,7 +38,7 @@ export default { ...@@ -38,7 +38,7 @@ export default {
38 38
39 copy({ 39 copy({
40 targets: [ 40 targets: [
41 - { src: 'src/images', dest: 'public' } 41 + { src: 'src/images', dest: 'public/build/static' }
42 ] 42 ]
43 }), 43 }),
44 44
......
1 +<script>
2 + import {LottiePlayer} from '@lottiefiles/svelte-lottie-player';
3 +
4 + export let count = 0;
5 +</script>
6 +
7 +<div id="loading" class:show={count > 0}>
8 + <LottiePlayer
9 + src="https://assets5.lottiefiles.com/packages/lf20_kblbXu.json" background="transparent" speed="1" width={300} height={300} controls={false} controlsLayout={null} loop autoplay>
10 + </LottiePlayer>
11 +</div>
12 +
13 +<style>
14 +#loading { position:fixed; width:100%; height:100%; z-index:9999; background-color:rgba(0,0,0,0.3); align-items:center; justify-content:center; display:none; }
15 +#loading.show { display:flex; }
16 +</style>
...\ No newline at end of file ...\ No newline at end of file
No preview for this file type
1 import Search from './routes/Search.svelte'; 1 import Search from './routes/Search.svelte';
2 +import Character from './routes/Character.svelte';
2 3
3 const routes = { 4 const routes = {
4 '/': Search, 5 '/': Search,
6 + '/character': Character,
7 + '/character/:character': Character,
5 }; 8 };
6 9
7 export default routes; 10 export default routes;
...\ No newline at end of file ...\ No newline at end of file
......
1 +<script>
2 + export let params = {};
3 +
4 + import {push} from 'svelte-spa-router';
5 + import axios from 'axios';
6 + import Loading from '../components/Loading.svelte';
7 +
8 + let callCount = 0;
9 + let isBuff = false;
10 + let isCharacterLoading = false;
11 + let stats;
12 +
13 + let character = {
14 + info:{
15 + avatar:'',
16 + nickname:'',
17 + characterCode:'',
18 + job:'',
19 + majorName:'',
20 + attackPowerName:'',
21 + server:{
22 + name:'',
23 + icon:''
24 + },
25 + level:237
26 + },
27 + analysis:{
28 + default:{
29 + stats:{
30 + major:{
31 + pure:0,
32 + percent:0,
33 + added:0,
34 + },
35 + minor:0,
36 + damage:{
37 + all:0,
38 + boss:0
39 + },
40 + finalDamage:0,
41 + criticalDamage:0,
42 + attackPower:{
43 + pure:0,
44 + percent:0,
45 + },
46 + ignoreGuard:0
47 + },
48 + efficiency:{
49 + major:{
50 + pure:1,
51 + percent:1
52 + },
53 + attackPower:{
54 + pure:1,
55 + percent:1
56 + },
57 + damage:1,
58 + criticalDamage:1,
59 + ignoreGuard:1
60 + }
61 + }
62 + },
63 + buff:{
64 + stats:{
65 + major:{
66 + pure:0,
67 + percent:0,
68 + added:0,
69 + },
70 + minor:0,
71 + damage:{
72 + all:0,
73 + boss:0
74 + },
75 + finalDamage:0,
76 + criticalDamage:0,
77 + attackPower:{
78 + pure:0,
79 + percent:0,
80 + },
81 + ignoreGuard:0
82 + },
83 + efficiency:{
84 + major:{
85 + pure:1,
86 + percent:1
87 + },
88 + attackPower:{
89 + pure:1,
90 + percent:1
91 + },
92 + damage:1,
93 + criticalDamage:1,
94 + ignoreGuard:1
95 + }
96 + }
97 + }
98 +
99 + function init() {
100 + let nickname;
101 +
102 + if(!params.character) {
103 + M.toast({html:"캐릭터명을 입력해주세요."});
104 + push("/");
105 + }
106 +
107 + nickname = decodeURI(params.character);
108 +
109 + callCount++;
110 + axios.get('/api/character', {
111 + params:{
112 + nickname:nickname
113 + }
114 + }).then(function(response) {
115 + character = response.data;
116 + isCharacterLoading = true;
117 + }).catch(function(error) {
118 + switch(error.response.status) {
119 + case 404:
120 + M.toast({html:"존재하지 않는 캐릭터입니다."});
121 + break;
122 + case 403:
123 + M.toast({html:"캐릭터 정보 공개설정이 필요합니다."});
124 + setTimeout(function() {
125 + window.open("https://maplestory.nexon.com/MyMaple/Account/Character/Visibility");
126 + }, 2000);
127 + break;
128 + case 503:
129 + M.toast({html:"메이플스토리가 점검중입니다."});
130 + break;
131 + default:
132 + M.toast({html:"서버와의 통신이 원활하지 않습니다.<br><br>잠시 후에 시도해주세요."});
133 + break;
134 + }
135 + push('/');
136 + }).finally(function() {
137 + callCount--;
138 + });
139 + }
140 +
141 + function showValue(value) {
142 + return parseFloat(value).toFixed(2);
143 + }
144 +
145 + function goBack() {
146 + push('/');
147 + }
148 +
149 + $:
150 + if(isCharacterLoading && isBuff) {
151 + stats = character.analysis.buff;
152 + } else {
153 + stats = character.analysis.default;
154 + }
155 +
156 + init();
157 +</script>
158 +
159 +<svelte:head>
160 +
161 +</svelte:head>
162 +
163 +<Loading count={callCount} />
164 +<section>
165 + {#if isCharacterLoading}
166 + <article class="info-box">
167 + <div class="row">
168 + <div class="col s12 m10 l8 offset-m1 offset-l2">
169 + <div class="row">
170 + <div class="col s12 m4 l3">
171 + <div class="card character-card">
172 + <div class="card-stacked">
173 + <div class="card-content">
174 + <div class="character-img">
175 + <img src={character.info.avatar} class="responsive-img" alt="캐릭터">
176 + </div>
177 + <h6 class="pink-text text-accent-3">
178 + <img src={character.info.server.icon} alt={character.info.server.name}>
179 + {character.info.nickname}
180 + </h6>
181 + <div class="job grey-text text-darken-2">
182 + {character.info.job}
183 + </div>
184 + <div class="level grey-text text-darken-2">
185 + Lv.{character.info.level}
186 + </div>
187 + </div>
188 + </div>
189 + </div>
190 + <div class="back-button-box">
191 + <button class="btn waves-light btn red accent-2" on:click={goBack}>
192 + <i class="material-icons">arrow_back</i>
193 + <span>뒤로가기</span>
194 + </button>
195 + </div>
196 + </div>
197 + <div class="col s12 m8 l9">
198 + <div class="card character-card">
199 + <div class="card-stacked">
200 + <div class="card-content">
201 + <div class="buff-switch">
202 + <div class="switch">
203 + <label>
204 + 노버프
205 + <input type="checkbox" bind:checked={isBuff}>
206 + <span class="lever"></span>
207 + 버프(자벞,링크,노블,영메)
208 + </label>
209 + </div>
210 + </div>
211 + <table class="table-efficiency">
212 + <thead>
213 + <tr>
214 + <th>스탯</th>
215 + <th>효율</th>
216 + </tr>
217 + </thead>
218 + <tbody>
219 + <tr>
220 + <th rowspan="2">{character.info.majorName} 1%</th>
221 + <td>{character.info.majorName} {showValue(stats.efficiency.major.percent)}</td>
222 + </tr>
223 + <tr>
224 + <td>{character.info.attackPowerName} {showValue(stats.efficiency.major.percent / stats.efficiency.attackPower.pure)}</td>
225 + </tr>
226 + <tr>
227 + <th>{character.info.attackPowerName} 1</th>
228 + <td>{character.info.majorName} {showValue(stats.efficiency.attackPower.pure)}</td>
229 + </tr>
230 + <tr>
231 + <th rowspan="5">{character.info.attackPowerName} 1%</th>
232 + <td>{character.info.majorName} {showValue(stats.efficiency.attackPower.percent)}</td>
233 + </tr>
234 + <tr>
235 + <td>{character.info.majorName} {showValue(stats.efficiency.attackPower.percent / stats.efficiency.major.percent)}%</td>
236 + </tr>
237 + <tr>
238 + <td>{character.info.attackPowerName} {showValue(stats.efficiency.attackPower.percent / stats.efficiency.attackPower.pure)}</td>
239 + </tr>
240 + <tr>
241 + <td>데미지(보공) {showValue(stats.efficiency.attackPower.percent / stats.efficiency.damage)}%</td>
242 + </tr>
243 + <tr>
244 + <td>방무 {showValue(stats.efficiency.attackPower.percent / stats.efficiency.ignoreGuard)}%</td>
245 + </tr>
246 + <tr>
247 + <th rowspan="2">데미지(보공) 1%</th>
248 + <td>{character.info.majorName} {showValue(stats.efficiency.damage)}</td>
249 + </tr>
250 + <tr>
251 + <td>방무 {showValue(stats.efficiency.damage / stats.efficiency.ignoreGuard)}%</td>
252 + </tr>
253 + <tr>
254 + <th rowspan="2">크뎀 1%</th>
255 + <td>{character.info.majorName} {showValue(stats.efficiency.criticalDamage)}</td>
256 + </tr>
257 + <tr>
258 + <td>{character.info.majorName} {showValue(stats.efficiency.criticalDamage / stats.efficiency.major.percent)}%</td>
259 + </tr>
260 + <tr>
261 + <th>방무 1%</th>
262 + <td>{character.info.majorName} {showValue(stats.efficiency.ignoreGuard)}</td>
263 + </tr>
264 + </tbody>
265 + </table>
266 + </div>
267 + </div>
268 + </div>
269 + </div>
270 + </div>
271 + </div>
272 + </div>
273 + </article>
274 + {/if}
275 +</section>
276 +
277 +<style>
278 +section { width:100%; height:100%; display:flex; flex-direction:column; padding:20px 0; }
279 +.info-box { margin:auto 0; }
280 +.info-box > .row > .col > .row > .col { margin-bottom:.5rem; }
281 +.character-card .card-content { text-align:center; }
282 +.character-card .card-content .job { font-size:0.8em }
283 +.character-card .card-content .level { font-size:0.8em }
284 +.character-card .card-content h6 img { width:14px; height:14px; }
285 +.character-card .card-content h6 { font-weight:bold; }
286 +.table-efficiency td, .table-efficiency th { text-align:left; }
287 +.back-button-box button { width:100%; display:block; height:48px; line-height:48px; }
288 +.back-button-box button i.material-icons { vertical-align:middle; }
289 +.back-button-box button span { vertical-align:middle; }
290 +.buff-switch .switch label input[type=checkbox]:checked+.lever:after { background-color:#e57373; }
291 +.buff-switch .switch label input[type=checkbox]:not(:checked)+.lever { background-color:#ffcdd2; }
292 +.buff-switch .switch label input[type=checkbox]:checked+.lever { background-color:#ef9a9a ; }
293 +</style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
38 </p> 38 </p>
39 <p> 39 <p>
40 <a href="https://maplestory.nexon.com/MyMaple/Account/Character/Visibility" target="_BLANK">공개설정하러 가기</a> 40 <a href="https://maplestory.nexon.com/MyMaple/Account/Character/Visibility" target="_BLANK">공개설정하러 가기</a>
41 + </p>
42 + <p class="red-text text-accent-1">
43 + <i class="material-icons">info_outline</i>
44 + <span>제논, 데몬어벤져는 지원하지 않습니다.</span>
41 </p> 45 </p>
42 </div> 46 </div>
43 </div> 47 </div>
...@@ -47,9 +51,11 @@ ...@@ -47,9 +51,11 @@
47 </section> 51 </section>
48 52
49 <style> 53 <style>
50 -section { width:100%; height:100%; display:flex; flex-direction:column; justify-content:center; } 54 +section { width:100%; height:100%; display:flex; flex-direction:column; }
51 -.search-box { width:100%; } 55 +.search-box { width:100%; margin:auto 0; }
52 h4 { font-size:20px; text-align:center; } 56 h4 { font-size:20px; text-align:center; }
53 .input-field { padding-right:70px; } 57 .input-field { padding-right:70px; }
54 .input-field button { position:absolute; right:0; top:7px; } 58 .input-field button { position:absolute; right:0; top:7px; }
59 +.card-action i.material-icons { font-size:1.1em; vertical-align:middle; }
60 +.card-action i.material-icons ~ span { vertical-align:middle; }
55 </style> 61 </style>
...\ No newline at end of file ...\ No newline at end of file
......