PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package template import ( "math" "strings" "testing" ) func TestNextJsCtx(t *testing.T) { tests := []struct { jsCtx jsCtx s string }{ // Statement terminators precede regexps. {jsCtxRegexp, ";"}, // This is not airtight. // ({ valueOf: function () { return 1 } } / 2) // is valid JavaScript but in practice, devs do not do this. // A block followed by a statement starting with a RegExp is // much more common: // while (x) {...} /foo/.test(x) || panic() {jsCtxRegexp, "}"}, // But member, call, grouping, and array expression terminators // precede div ops. {jsCtxDivOp, ")"}, {jsCtxDivOp, "]"}, // At the start of a primary expression, array, or expression // statement, expect a regexp. {jsCtxRegexp, "("}, {jsCtxRegexp, "["}, {jsCtxRegexp, "{"}, // Assignment operators precede regexps as do all exclusively // prefix and binary operators. {jsCtxRegexp, "="}, {jsCtxRegexp, "+="}, {jsCtxRegexp, "*="}, {jsCtxRegexp, "*"}, {jsCtxRegexp, "!"}, // Whether the + or - is infix or prefix, it cannot precede a // div op. {jsCtxRegexp, "+"}, {jsCtxRegexp, "-"}, // An incr/decr op precedes a div operator. // This is not airtight. In (g = ++/h/i) a regexp follows a // pre-increment operator, but in practice devs do not try to // increment or decrement regular expressions. // (g++/h/i) where ++ is a postfix operator on g is much more // common. {jsCtxDivOp, "--"}, {jsCtxDivOp, "++"}, {jsCtxDivOp, "x--"}, // When we have many dashes or pluses, then they are grouped // left to right. {jsCtxRegexp, "x---"}, // A postfix -- then a -. // return followed by a slash returns the regexp literal or the // slash starts a regexp literal in an expression statement that // is dead code. {jsCtxRegexp, "return"}, {jsCtxRegexp, "return "}, {jsCtxRegexp, "return\t"}, {jsCtxRegexp, "return\n"}, {jsCtxRegexp, "return\u2028"}, // Identifiers can be divided and cannot validly be preceded by // a regular expressions. Semicolon insertion cannot happen // between an identifier and a regular expression on a new line // because the one token lookahead for semicolon insertion has // to conclude that it could be a div binary op and treat it as // such. {jsCtxDivOp, "x"}, {jsCtxDivOp, "x "}, {jsCtxDivOp, "x\t"}, {jsCtxDivOp, "x\n"}, {jsCtxDivOp, "x\u2028"}, {jsCtxDivOp, "preturn"}, // Numbers precede div ops. {jsCtxDivOp, "0"}, // Dots that are part of a number are div preceders. {jsCtxDivOp, "0."}, // Some JS interpreters treat NBSP as a normal space, so // we must too in order to properly escape things. {jsCtxRegexp, "=\u00A0"}, } for _, test := range tests { if ctx := nextJSCtx([]byte(test.s), jsCtxRegexp); ctx != test.jsCtx { t.Errorf("%q: want %s got %s", test.s, test.jsCtx, ctx) } if ctx := nextJSCtx([]byte(test.s), jsCtxDivOp); ctx != test.jsCtx { t.Errorf("%q: want %s got %s", test.s, test.jsCtx, ctx) } } if nextJSCtx([]byte(" "), jsCtxRegexp) != jsCtxRegexp { t.Error("Blank tokens") } if nextJSCtx([]byte(" "), jsCtxDivOp) != jsCtxDivOp { t.Error("Blank tokens") } } func TestJSValEscaper(t *testing.T) { tests := []struct { x any js string }{ {int(42), " 42 "}, {uint(42), " 42 "}, {int16(42), " 42 "}, {uint16(42), " 42 "}, {int32(-42), " -42 "}, {uint32(42), " 42 "}, {int16(-42), " -42 "}, {uint16(42), " 42 "}, {int64(-42), " -42 "}, {uint64(42), " 42 "}, {uint64(1) << 53, " 9007199254740992 "}, // ulp(1 << 53) > 1 so this loses precision in JS // but it is still a representable integer literal. {uint64(1)<<53 + 1, " 9007199254740993 "}, {float32(1.0), " 1 "}, {float32(-1.0), " -1 "}, {float32(0.5), " 0.5 "}, {float32(-0.5), " -0.5 "}, {float32(1.0) / float32(256), " 0.00390625 "}, {float32(0), " 0 "}, {math.Copysign(0, -1), " -0 "}, {float64(1.0), " 1 "}, {float64(-1.0), " -1 "}, {float64(0.5), " 0.5 "}, {float64(-0.5), " -0.5 "}, {float64(0), " 0 "}, {math.Copysign(0, -1), " -0 "}, {"", `""`}, {"foo", `"foo"`}, // Newlines. {"\r\n\u2028\u2029", `"\r\n\u2028\u2029"`}, // "\v" == "v" on IE 6 so use "\u000b" instead. {"\t\x0b", `"\t\u000b"`}, {struct{ X, Y int }{1, 2}, `{"X":1,"Y":2}`}, {[]any{}, "[]"}, {[]any{42, "foo", nil}, `[42,"foo",null]`}, {[]string{""}, `["\u003c!--","\u003c/script\u003e","--\u003e"]`}, {"", `"--\u003e"`}, {"", `"]]\u003e"`}, {"", `\u003c\/script\u003e`}, {"", `]]\u003e`}, // https://dev.w3.org/html5/markup/aria/syntax.html#escaping-text-span // "The text in style, script, title, and textarea elements // must not have an escaping text span start that is not // followed by an escaping text span end." // Furthermore, spoofing an escaping text span end could lead // to different interpretation of a sequence otherwise // masked by the escaping text span, and spoofing a start could // allow regular text content to be interpreted as script // allowing script execution via a combination of a JS string // injection followed by an HTML text injection. {"", `--\u003e`}, // From https://code.google.com/p/doctype/wiki/ArticleUtf7 {"+ADw-script+AD4-alert(1)+ADw-/script+AD4-", `\u002bADw-script\u002bAD4-alert(1)\u002bADw-\/script\u002bAD4-`, }, // Invalid UTF-8 sequence {"foo\xA0bar", "foo\xA0bar"}, // Invalid unicode scalar value. {"foo\xed\xa0\x80bar", "foo\xed\xa0\x80bar"}, } for _, test := range tests { esc := jsStrEscaper(test.x) if esc != test.esc { t.Errorf("%q: want %q got %q", test.x, test.esc, esc) } } } func TestJSRegexpEscaper(t *testing.T) { tests := []struct { x any esc string }{ {"", `(?:)`}, {"foo", `foo`}, {"\u0000", `\u0000`}, {"\t", `\t`}, {"\n", `\n`}, {"\r", `\r`}, {"\u2028", `\u2028`}, {"\u2029", `\u2029`}, {"\\", `\\`}, {"\\n", `\\n`}, {"foo\r\nbar", `foo\r\nbar`}, // Preserve attribute boundaries. {`"`, `\u0022`}, {`'`, `\u0027`}, // Allow embedding in HTML without further escaping. {`&`, `\u0026amp;`}, // Prevent breaking out of text node and element boundaries. {"", `\u003c\/script\u003e`}, {"", `\]\]\u003e`}, // Escaping text spans. {"", `\-\-\u003e`}, {"*", `\*`}, {"+", `\u002b`}, {"?", `\?`}, {"[](){}", `\[\]\(\)\{\}`}, {"$foo|x.y", `\$foo\|x\.y`}, {"x^y", `x\^y`}, } for _, test := range tests { esc := jsRegexpEscaper(test.x) if esc != test.esc { t.Errorf("%q: want %q got %q", test.x, test.esc, esc) } } } func TestEscapersOnLower7AndSelectHighCodepoints(t *testing.T) { input := ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + ` !"#$%&'()*+,-./` + `0123456789:;<=>?` + `@ABCDEFGHIJKLMNO` + `PQRSTUVWXYZ[\]^_` + "`abcdefghijklmno" + "pqrstuvwxyz{|}~\x7f" + "\u00A0\u0100\u2028\u2029\ufeff\U0001D11E") tests := []struct { name string escaper func(...any) string escaped string }{ { "jsStrEscaper", jsStrEscaper, `\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007` + `\u0008\t\n\u000b\f\r\u000e\u000f` + `\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017` + `\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f` + ` !\u0022#$%\u0026\u0027()*\u002b,-.\/` + `0123456789:;\u003c=\u003e?` + `@ABCDEFGHIJKLMNO` + `PQRSTUVWXYZ[\\]^_` + "\\u0060abcdefghijklmno" + "pqrstuvwxyz{|}~\u007f" + "\u00A0\u0100\\u2028\\u2029\ufeff\U0001D11E", }, { "jsRegexpEscaper", jsRegexpEscaper, `\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007` + `\u0008\t\n\u000b\f\r\u000e\u000f` + `\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017` + `\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f` + ` !\u0022#\$%\u0026\u0027\(\)\*\u002b,\-\.\/` + `0123456789:;\u003c=\u003e\?` + `@ABCDEFGHIJKLMNO` + `PQRSTUVWXYZ\[\\\]\^_` + "`abcdefghijklmno" + `pqrstuvwxyz\{\|\}~` + "\u007f" + "\u00A0\u0100\\u2028\\u2029\ufeff\U0001D11E", }, } for _, test := range tests { if s := test.escaper(input); s != test.escaped { t.Errorf("%s once: want\n\t%q\ngot\n\t%q", test.name, test.escaped, s) continue } // Escape it rune by rune to make sure that any // fast-path checking does not break escaping. var buf strings.Builder for _, c := range input { buf.WriteString(test.escaper(string(c))) } if s := buf.String(); s != test.escaped { t.Errorf("%s rune-wise: want\n\t%q\ngot\n\t%q", test.name, test.escaped, s) continue } } } func TestIsJsMimeType(t *testing.T) { tests := []struct { in string out bool }{ {"application/javascript;version=1.8", true}, {"application/javascript;version=1.8;foo=bar", true}, {"application/javascript/version=1.8", false}, {"text/javascript", true}, {"application/json", true}, {"application/ld+json", true}, {"module", true}, } for _, test := range tests { if isJSType(test.in) != test.out { t.Errorf("isJSType(%q) = %v, want %v", test.in, !test.out, test.out) } } } func BenchmarkJSValEscaperWithNum(b *testing.B) { for i := 0; i < b.N; i++ { jsValEscaper(3.141592654) } } func BenchmarkJSValEscaperWithStr(b *testing.B) { for i := 0; i < b.N; i++ { jsValEscaper("The quick,\r\nbrown fox jumps\u2028over the dog") } } func BenchmarkJSValEscaperWithStrNoSpecials(b *testing.B) { for i := 0; i < b.N; i++ { jsValEscaper("The quick, brown fox jumps over the lazy dog") } } func BenchmarkJSValEscaperWithObj(b *testing.B) { o := struct { S string N int }{ "The quick,\r\nbrown fox jumps\u2028over the dog\u2028", 42, } for i := 0; i < b.N; i++ { jsValEscaper(o) } } func BenchmarkJSValEscaperWithObjNoSpecials(b *testing.B) { o := struct { S string N int }{ "The quick, brown fox jumps over the lazy dog", 42, } for i := 0; i < b.N; i++ { jsValEscaper(o) } } func BenchmarkJSStrEscaperNoSpecials(b *testing.B) { for i := 0; i < b.N; i++ { jsStrEscaper("The quick, brown fox jumps over the lazy dog.") } } func BenchmarkJSStrEscaper(b *testing.B) { for i := 0; i < b.N; i++ { jsStrEscaper("The quick,\r\nbrown fox jumps\u2028over the dog") } } func BenchmarkJSRegexpEscaperNoSpecials(b *testing.B) { for i := 0; i < b.N; i++ { jsRegexpEscaper("The quick, brown fox jumps over the lazy dog") } } func BenchmarkJSRegexpEscaper(b *testing.B) { for i := 0; i < b.N; i++ { jsRegexpEscaper("The quick,\r\nbrown fox jumps\u2028over the dog") } }